消息:尝试通过Selenium和Python单击复选框时,元素不可见

时间:2018-07-18 12:56:05

标签: python selenium selenium-webdriver xpath css-selectors

我正在尝试使我一直在从事的项目的一部分自动化。 项目的这一部分应进入页面并获得随机生成的密钥。 要获取密钥,请转到网页,登录,然后按一些按钮以获取新密钥。 我一直在使用Selenium和Chrome驱动程序。

driver = webdriver.Chrome()

当我不得不选中某些复选框时,问题就开始了。

页面的外观如下: https://imgur.com/a/p3kmklT

源文件看起来像其JavaScript呈现的。

到目前为止我尝试过的是: 通过ID获取它:

checkbox = label.find_element_by_id("agreed")
checkbox.click()

通过XPath获取它:

checkbox = driver.find_element_by_xpath('//*[@id="agreed"]')

两个都给我

Message: element not visible

我也尝试过等待它可见,但是它只是等待并最终给我以下内容:

checkbox = WebDriverWait(driver, 3).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="agreed"]')))
checkbox.click()

输出:

Message: 

3 个答案:

答案 0 :(得分:2)

您应该在控制台中检查该ID是否仅返回一个或多个元素,然后再返回一个。 有时,相同ID或选择器的DOM中会有不止一个元素。 其中一个隐藏,一个可见。您必须找到可见的一个并单击它。 另外,请检查iframe中是否不存在该元素。

在控制台中,在下面的行中编写代码,以查看此id的元素数:

$x("//*[@id='agreed']")

希望对您有帮助。

答案 1 :(得分:2)

要单击与元素关联的复选框,其文本为我同意API服务协议,而不是调用visibility_of_element_located(),则需要调用 element_to_be_clickable() ,您可以使用以下任一解决方案:

  • CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "label[for='agreed']"))).click()
    
  • XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@for='agreed']"))).click()
    

答案 2 :(得分:1)

始终记住使用driver.implicitly_wait(X),其中X是秒数,使驱动程序在找不到元素时自动重试。除了浏览器自动化之外,您是否还尝试捕获请求?在类似的情况下,我设法使用会话中的cookie来自动执行发布请求。如果您不走运,并且一段时间后会话超时,则可以使用Selenium脚本更新Cookie并继续自动请求。