【问题标题】:Message: element not visible when tring to click a checkbox through Selenium and Python消息:尝试通过 Selenium 和 Python 单击复选框时元素不可见
【发布时间】:2018-12-26 09:47:53
【问题描述】:

我正在尝试自动化我一直在从事的项目的一部分。 这部分项目应该进入一个页面,得到一个随机生成的key。 要获取密钥,它会进入网页,登录,然后按一些按钮来获取新密钥。 我一直在将 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: 

【问题讨论】:

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


    【解决方案1】:

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

    • 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】:

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

    在控制台写下面的行来查看这个 id 的元素数量:

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

    希望对你有所帮助。

    【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我稍后会研究这种方法。也许它会更好,因为硒有点慢。感谢您的提示!
    • 我在 2 周前编写了一个类似的数据收集脚本。通过复制请求而不是浏览器仿真,您将看到一个巨大的减速带。之后,如果您的需求太高,请开始尝试对您的请求进行多线程处理。我设法每秒收到大约 8 个回复,但这是服务器问题。如果服务器可以处理负载,即 25 个线程并且可以稳定地使用它。
    猜你喜欢
    • 2017-12-22
    • 2019-07-12
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    相关资源
    最近更新 更多