Python 3.x 加载页面后,Selenium按\u id查找\u元素\u失败

Python 3.x 加载页面后,Selenium按\u id查找\u元素\u失败,python-3.x,selenium,selenium-webdriver,webdriver,Python 3.x,Selenium,Selenium Webdriver,Webdriver,下面是一个简单的例子: 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创建的实

下面是一个简单的例子:

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(右键单击->检查元素)

是什么导致了这种行为


如何使其工作?

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

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

所需元素位于
中,因此您需要:

  • 诱导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需要导入WebDriverWait以获得所需的帧并切换到它?有什么理由等待静态节点吗?谢谢!在哪里可以了解有关模拟用户动作的更多信息?例如,现在我发现(在同一个网页上)调用“click”方法实际上不起作用,除非我在浏览器上手动向下滚动它自己检查我发现了两个关于在Selenium中滚动的问题,两个方法都不起作用。。。下面是代码:driver=webdriver.Firefox()driver.get(“)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_to_element(button.perform())button.click()您想滚动到Submit2按钮吗?每种方法都可能适用于特定的情况,在另一种情况下可能不起作用。而StackOverflow是您成为Selenium guru所需要的全部:)