Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
消息:通过Selenium和Python尝试单击复选框时元素不可见_Python_Selenium_Selenium Webdriver_Xpath_Css Selectors - Fatal编程技术网

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

消息:通过Selenium和Python尝试单击复选框时元素不可见,python,selenium,selenium-webdriver,xpath,css-selectors,Python,Selenium,Selenium Webdriver,Xpath,Css Selectors,我正在尝试自动化我一直在工作的项目的一部分。 项目的这一部分应该进入一个页面并获得一个随机生成的密钥。 要获取密钥,它会进入网页,登录,然后按一些按钮获取新密钥。 我一直在使用Selenium和Chrome驱动程序来实现这一点 driver = webdriver.Chrome() 当我必须勾选一些复选框时,问题就开始了 这是页面的外观: 源文件看起来像它的JavaScript呈现 到目前为止,我所尝试的: 通过id获取: checkbox = label.find_element_by_i

我正在尝试自动化我一直在工作的项目的一部分。 项目的这一部分应该进入一个页面并获得一个随机生成的密钥。 要获取密钥,它会进入网页,登录,然后按一些按钮获取新密钥。 我一直在使用Selenium和Chrome驱动程序来实现这一点

driver = webdriver.Chrome()
当我必须勾选一些复选框时,问题就开始了

这是页面的外观:

源文件看起来像它的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: 

您应该在控制台中检查该id是否只返回一个元素或多个元素。 有时,DOM中存在多个相同id或选择器的元素。 一个是隐藏的,一个是可见的。你必须找到一个可见的并点击它。 还要检查iframe中是否不存在该元素

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

$x("//*[@id='agreed']")
希望对您有所帮助。

要单击与文本为的元素相关联的复选框,我同意API服务协议而不是调用
元素的可见性()

  • CSS\u选择器

    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()
    

始终记住使用
驱动程序。隐式地等待(X)
,其中X是在找不到元素时使驱动程序自动重试的秒数。除了浏览器自动化之外,您是否尝试过捕获请求?在类似的情况下,我使用会话中的cookies成功地自动化了post请求。如果您运气不好,并且在一段时间后出现会话超时,您可以使用selenium脚本更新Cookie并继续自动请求。

我已经检查了是否有其他元素与jqury具有相同的id,除此之外没有其他元素。还检查了jframes,我们没有anyLet。我刚刚尝试了你的方法,效果很好,谢谢!很好的回答和解释。我将在以后研究这个方法。也许这会更好,因为硒有点慢。谢谢你的提示!两周前,我编写了一个类似的数据收集脚本。通过复制请求而不是浏览器模拟,您将看到巨大的速度提升。之后,如果您的需求太高,开始尝试多线程处理您的请求。我设法每秒收到8封回复,但这是服务器问题。如果服务器能够用ie 25线程处理负载,并且能够稳定地使用它。