我正在尝试使我一直在从事的项目的一部分自动化。 项目的这一部分应进入页面并获得随机生成的密钥。 要获取密钥,请转到网页,登录,然后按一些按钮以获取新密钥。 我一直在使用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:
答案 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并继续自动请求。