【问题标题】:How does Selenium click on elements that are 50% on screen and 50% not on screen?Selenium 如何点击 50% 在屏幕上和 50% 不在屏幕上的元素?
【发布时间】:2020-03-26 07:23:26
【问题描述】:

有一个 div 元素。其大小的 50% 在屏幕上。其他 50% 超出屏幕高度并且不可见。 无法滚动。

我尝试使用 Selenium 自动执行测试并单击该 div 元素,但有时它有效,有时无效。

为什么 Selenium 不只是点击那个 div 的“屏幕区域”?

这个功能是如何实现的?当我告诉 Selenium 点击一个巨大的 div 元素时,它会点击该 div 上的随机位置吗?

【问题讨论】:

    标签: html selenium selenium-webdriver dom webdriver-w3c-spec


    【解决方案1】:

    如果您基于 xpath、id 等定位器进行点击,是的,它会点击随机位置。但只要元素被点击并执行该点击的结果动作就没有关系。

    关于有时它是否有效,如果您检查了按钮是否启用或单击,它将始终有效。

    【讨论】:

      【解决方案2】:

      元素的视野中心点

      根据WebDriver W3C 规范,元素的in-view center point 是矩形的原点位置,该矩形是元素的第一个DOM 客户矩形和初始viewport 之间的交点。

      给定一个已知在视图中的元素,可以这样计算:

      1. 设矩形为通过对元素调用 getClientRects 返回的 DOMRect 序列的第一个元素。
      2. 令left为max(0, min(x坐标, x坐标+宽度尺寸))。
      3. 设右为 min(innerWidth, max(x 坐标, x 坐标 + 宽度尺寸))。
      4. 让 top 为 max(0, min(y 坐标, y 坐标 + 高度维度))。
      5. 设底部为 min(innerHeight, max(y 坐标, y 坐标 + 高度维度))。
      6. 设 x 为底((左 + 右)÷ 2.0)。
      7. 设 y 为底((顶部 + 底部)÷ 2.0)。
      8. 返回 (x, y) 对。

      如果一个元素是它自己的指针可交互绘制树的成员,那么它就在视图中,假设它的指针事件没有被禁用。


      元素点击

      根据文档,Element Click 命令滚动查看元素,如果它还不是指针可交互的,并单击它的视图中心点。

      注意:如果元素的中心点被其他元素遮挡,则返回元素点击拦截错误。如果元素在视口之外,则返回元素不可交互错误。


      解决方案

      在这种情况下,有以下两种可能的解决方案:

      1. 您可以诱导WebDriverWaitexpected_conditions 设置为element_to_be_clickable()。因此,您的代码行将是:

        WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click()
        
      2. 您可以分别使用move_to_element(to_element)click(on_element=None) 方法。因此,您的代码行将是:

        ActionChains(driver).move_to_element(element).click(element).perform()
        

      参考

      您可以在selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element is not clickable with Selenium and Python找到相关讨论

      【讨论】:

      • 哦,button.click()this.driver.actions().click(button).perform(); 似乎工作方式不同。 click() 似乎一直有效,但通过驱动程序操作,它经常失败。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      相关资源
      最近更新 更多