【问题标题】:Selenium Unable to locate element (Python) [closed]Selenium 无法定位元素(Python)[关闭]
【发布时间】:2022-01-25 01:11:02
【问题描述】:

我正在尝试使用 selenium 无头网络驱动程序单击按钮

<button data-qa="STREAKS-QA_claim-button" class="css-19g9d2g" disabled=""><span class="css-kqn307"><span class="css-z2sz3e">Claim</span>&nbsp;<span class="css-1k2c4a5"><span class="infl-fe__styles__icon___3YFBO infl-fe__styles__coins___BelNu" aria-hidden="true"></span></span>&nbsp;2&nbsp;<span class="css-1f8ibv"><span class="infl-fe__styles__icon___3YFBO infl-fe__styles__check___l-v5z" aria-hidden="true"></span></span></span></button>

我的代码

element = browser.find_element_by_css_selector("button[data-qa=STREAKS-QA_claim-button]")
element.click()

它不起作用:(,需要一些建议。 提前致谢

【问题讨论】:

  • 添加包含您尝试单击的元素的 html/css 代码部分
  • “它不工作”不是很有帮助。请张贴实际/完整的错误消息,连同已请求的 HTML 一起正确格式化。
  • 得到错误:引发异常类(消息,屏幕,堆栈跟踪)selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:{“方法”:“css选择器”,选择器":"button[data-qa=STREAKS-QA_claim-button]"}

标签: python selenium selenium-webdriver


【解决方案1】:

如果我们在HTML DOM 中有唯一条目,请检查dev tools(谷歌浏览器)。

检查步骤:

Press F12 in Chrome -> 转到element 部分 -> 做一个CTRL + F -> 然后粘贴xpath/css 看看,如果你想要的element 用@ 得到高亮 987654328@匹配节点。

如果这是唯一的button[data-qa=STREAKS-QA_claim-button],那么您还需要检查以下条件。

  1. 检查它是否在任何iframe/frame/frameset中。

  2. 检查它是否在任何shadow-root中。

  3. 确保在与元素交互之前正确呈现元素。输入一些hardcoded delayExplicit wait 再试一次。

  4. 如果您已重定向到new tab/ or new windows 并且您没有切换 到特定的new tab/new window,否则您可能会收到NoSuchElement 异常。

  5. 如果您已切换到 iframe,并且所需的新元素不在同一个 iframe 上下文中,则首先switch to default content,然后与之交互。

如果它只是一个元素渲染问题:

代码试用 1:

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-qa=STREAKS-QA_claim-button]"))).click()

进口:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains

【讨论】:

    【解决方案2】:

    您的定位器中缺少'
    此外,您可能错过了延迟。
    如果是这样,添加一个虚拟睡眠

    time.sleep(5)
    

    之前

    element = browser.find_element_by_css_selector("button[data-qa='STREAKS-QA_claim-button']")
    element.click()
    

    应该可以工作。
    但是,建议在这里使用预期条件显式等待,如下所示:

    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "button[data-qa='STREAKS-QA_claim-button']"))).click()
    

    您将需要这些导入:

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    

    要初始化wait 对象,您必须这样做

    wait = WebDriverWait(driver, 20)
    

    【讨论】:

    • 我同意你的回答,我确实错过了奇怪的 ' ' 但是我在浏览器控制台中写了这个 button[data-qa=STREAKS-QA_claim-button] 并且可以看到所需的元素被突出显示。对此有什么想法吗?
    【解决方案3】:

    元素是一个动态元素。所以点击你需要诱导WebDriverWaitelement_to_be_clickable()的元素,你可以使用以下Locator Strategies之一:

    • 使用CSS_SELECTOR

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-qa='STREAKS-QA_claim-button']>span[class^='css']>span[class^='css']"))).click()
      
    • 使用XPATH

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@data-qa='STREAKS-QA_claim-button']//span[text()='Claim']"))).click()
      
    • 注意:您必须添加以下导入:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      

    【讨论】:

      猜你喜欢
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 2020-08-02
      相关资源
      最近更新 更多