Selenium 检查用户是否可以看到WebElement(由于CSS而被覆盖)

Selenium 检查用户是否可以看到WebElement(由于CSS而被覆盖),selenium,Selenium,在下面的代码中,我有两个标记,它们显示不同颜色的列,一个红色,一个绿色: <html> <body> <style> html, body { height: 100%; } #red { width:50%; background: #f00; height: 100%; }

在下面的代码中,我有两个
标记,它们显示不同颜色的列,一个红色,一个绿色:

<html>
    <body>
        <style>
        html, body {
            height: 100%;
        }

        #red {
            width:50%;
            background: #f00;
            height: 100%;
        }
        #green {
            width: 250px;
            background: #0f0;
            height: 100%;
        }
        </style>
        <div id="red">
        </div>
        <div id="green">
        </div>
    </body>
</html>
但是,这个解决方案在现实世界中对我不起作用,因为我想在单击时检查do something的可见性,虽然我想确保它们对用户可见,但我不希望它们被单击


那么,如果某个Web元素由于CSS而被覆盖,我如何检查它是否对用户可见呢?

我最近遇到了类似的要求。我还没有实现完整的解决方案,但在高层次上,这些是我正在采取的步骤。验证元素
是否与任何其他元素重叠

  • 获取有问题的元素,将该元素的click()事件绑定到一个不执行任何操作的函数
  • 单击元素的9个点-中心;顶部:左、中、右;中间:左,右;底部:左、中、右。默认情况下,Selenium单击位于中心点的图元。其他点可以通过元素的DOM定位然后移动到各个点来计算
  • 将步骤2中的调用块包装在try/catch中,以检查
    元素不可单击…
    异常
  • 若抛出异常,则元素在其中一个单击点上被另一个元素重叠
  • 这里的挑战肯定是click事件的绑定/解除绑定。对于我的特殊情况,直接使用JQuery来实现绑定

    我最初想到的处理点击问题的另一种方法是在运行测试之前禁用驱动程序中的Javascript。但当然,只有在呈现页面元素时不涉及JS技巧时,这种方法才会起作用


    挑战的第二部分是单击点的粒度。沿边缘的8个点通常有效,但如果单击点之外有重叠,则必须增加单击点的数量。

    我最近遇到了类似的要求。我还没有实现完整的解决方案,但在高层次上,这些是我正在采取的步骤。验证元素
    是否与任何其他元素重叠

  • 获取有问题的元素,将该元素的click()事件绑定到一个不执行任何操作的函数
  • 单击元素的9个点-中心;顶部:左、中、右;中间:左,右;底部:左、中、右。默认情况下,Selenium单击位于中心点的图元。其他点可以通过元素的DOM定位然后移动到各个点来计算
  • 将步骤2中的调用块包装在try/catch中,以检查
    元素不可单击…
    异常
  • 若抛出异常,则元素在其中一个单击点上被另一个元素重叠
  • 这里的挑战肯定是click事件的绑定/解除绑定。对于我的特殊情况,直接使用JQuery来实现绑定

    我最初想到的处理点击问题的另一种方法是在运行测试之前禁用驱动程序中的Javascript。但当然,只有在呈现页面元素时不涉及JS技巧时,这种方法才会起作用


    挑战的第二部分是单击点的粒度。沿边缘的8个点通常有效,但如果单击点之外有重叠,则必须增加单击点的数量。

    我希望找到一种解决方案,因为您介绍了必要的解决方法,因此不涉及单击。我们将看看其他人是否有任何解决方案,否则这可能是正确的答案。我希望找到一个不涉及单击的解决方案,因为您描述了必要的解决方法。我们将看看其他人是否有任何解决方案,否则这可能是正确的答案。
    org.openqa.selenium.WebDriverException: unknown error: Element is not clickable at point (133, 361). Other element would receive the click: <div id="red">...</div>