【问题标题】:Selenium find_element_by_id fails after loading the pageSelenium find_element_by_id 加载页面后失败
【发布时间】:2019-03-13 01:48:11
【问题描述】:

这是一个简单的例子:

from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.dcor.state.ga.us/GDC/Offender/Query")
button = driver.find_element_by_id('submit2')

无论我等待多长时间,最后一个命令都会失败(与之前的问题和答案不同 - 页面加载后很长时间),但是当我进入浏览器本身(Selenium 创建的实例)时,绿色的“我同意”按钮的 ID 为 submit2(右键单击->检查元素)...

是什么导致了这种行为?

我怎样才能让它工作?

【问题讨论】:

标签: python-3.x selenium selenium-webdriver webdriver


【解决方案1】:

这是因为表单位于 iframe 内,所以在定位元素之前需要切换到该框架:

driver.switch_to.frame('iframe-content')

【讨论】:

  • 谢谢你!我在哪里可以了解有关模拟用户操作的更多信息?例如,现在我发现(在同一个网页上)调用“click”方法由于某种原因实际上不起作用——除非我在浏览器本身上手动向下滚动
  • 我发现了 2 个关于在 Selenium 中滚动的问题,但两种方法都不起作用...代码如下: driver = webdriver.Firefox() driver.get("dcor.state.ga.us/GDC/Offender/Query") driver.switch_to.frame(' iframe-content') #driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") button=driver.find_element_by_id('submit2') actions = ActionChains(driver) actions.move_to_element(button).perform () button.click()
  • 你想滚动到那个 Submit2 按钮吗?
  • 每种方法可能适用于特定情况,可能不适用于另一种情况。 Documentation 和 StackOverflow 是你成为 Selenium 大师所需要的一切:)
【解决方案2】:

所需的元素在 <iframe> 内,因此您需要:

  • 诱导 WebDriverWait 使所需的框架可用并切换到它。
  • 诱导 WebDriverWait 使所需元素可点击,您可以使用以下解决方案:
  • 代码块:

    WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"iframe-content")))
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.oq-sub.btn.btn-success#submit2"))).click()
    

【讨论】:

  • 为什么 OP 需要 Induce WebDriverWait 以使所需的框架可用并切换到它?有什么理由等待静态节点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2023-03-30
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多