【问题标题】:Cant Find Element in Selenium Python在 Selenium Python 中找不到元素
【发布时间】:2020-01-10 22:32:19
【问题描述】:

您好,我正在尝试使用 selenium 查找要单击的按钮。下面是我正在使用的 HTML 代码的 sn-p。

<input type="button" id="runButton" class="button" value="Run Report" onclick="chooseRun()">

我正在尝试使用下面的代码单击 runButton。

elem = driver.find_element_by_id('runButton').click()

我收到以下错误消息:

NoSuchElementException: Message: Unable to find element with css selector == [id="runButton"]

不知道还有什么可以尝试的。

【问题讨论】:

  • 请附上检查元素页面的屏幕截图以及您到目前为止尝试过的代码。 SO 用于帮助开发人员找到解决问题的方法。主要是调试。不提供代码真的很难帮你:)
  • 我发布了检查元素的 HTML 以及我尝试过的代码。我继续并附上了检查元素的图片。

标签: python-3.x selenium xpath css-selectors webdriverwait


【解决方案1】:

您最有可能需要做的是使用等待来找到您的元素。您需要留出时间让元素可见、可点击等,然后才能与之交互。您可以在此处找到有关等待的信息:https://selenium-python.readthedocs.io/waits.html

取自上述网站:

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

elem = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "runButton"))

如果等待不起作用,那么您的元素可能位于 iframe 中。您需要先切换到该 iframe,然后搜索该元素才能找到它。

你会像找到另一个元素一样找到 iframe,然后像这样切换到它:

iframe = driver.find_element_by_id("content_Iframe")
driver.switch_to.frame(iframe)

button = driver.find_element_by_id("runButton")
button.click()

一旦你完成了 iframe 和它的内容,你需要切换回它:

driver.switch_to.default_content()

【讨论】:

  • 感谢 RKelley 的回复。我试过了,甚至把等待时间设置为 30,但它没有用。我什至找不到父元素,但也找不到它的 ID。会不会是什么都不可见或硒中的错误?
  • 如果你添加了等待,但它仍然找不到元素,那么它可能在 iFrame 内。您可以将页面的 html 添加到您的问题中吗?
  • 我想我的问题是我在这个页面上找不到任何东西。我尝试使用 Id 方法使用元素查找元素,但找不到 Id。该按钮似乎位于表格中。我已经发布了上面 HTML 的屏幕截图。
  • 即使它在表格中,您仍然应该能够找到它。你能把所有的html都给吗?如果您的按钮位于 iframe 内,您将无法检测到,直到先切换到该 iframe。
  • 我能够确定此表在 iframe 内。请参阅下面的 iframe。我无法发布整个 HTML 代码。我能够通过它的 ID 找到这个 iframe。接下来我需要做什么?
【解决方案2】:

该元素似乎是一个动态元素,所以要在需要使用element_to_be_clickable() 的元素上使用click() 并且可以使用以下任一Locator Strategies

  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.button#runButton[value='Run Report']"))).click()
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='button' and @id='runButton'][@value='Run Report']"))).click()
    
  • 注意:您必须添加以下导入:

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

【讨论】:

    猜你喜欢
    • 2021-08-27
    • 2021-12-17
    • 2018-11-07
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多