元素 - 硒webdriver的可见性

时间:2017-09-13 10:48:29

标签: selenium webdriver

我的脚本会创建一篇新文章:填写少量字段,然后点击页面末尾的“提交按钮”。

我在Click()类中编写了util函数,如:

public void click(String xpathKey)
{
    WebElement myDynamicElement = (new WebDriverWait(driver, 60))
      .until(ExpectedConditions.visibilityOfElementLocated(
               By.cssSelector(prop.getProperty(xpathKey))));

    try
    {
        myDynamicElement.click();
    }
    catch (Exception e)
    {
        e.printStackTrace();
        throw e;
    }
}

等待元素的可见性意味着它会等到元素在页面或屏幕上可见?我的脚本点击了提交按钮,但在页面上并不完全可见。

我正在运行这个脚本几个月,它运行得非常好。突然它开始给出错误元素在点(213,415)处不可点击。它从未出现过。任何人都有一个想法,为什么它可能发生?

我做过很多情况,其中元素不完全可见,通常在页面末尾按钮。 selenium不会自动滚动,它会找到元素并执行操作。

2 个答案:

答案 0 :(得分:1)

试试这个。

public void click(String xpathKey)
{
    WebElement myDynamicElement = (new WebDriverWait(driver, 60))
      .until(ExpectedConditions.visibilityOfElementLocated(
               By.cssSelector(prop.getProperty(xpathKey))));

    try
    {
         Actions act = new Actions(driver);
         act.moveToElement(myDynamicElement);
         act.click();
         act.build().perform();
    }
    catch (Exception e)
    {
        e.printStackTrace();
        throw e;
    }
}

答案 1 :(得分:-1)

您收到的错误消息表示有一个元素覆盖您尝试单击的元素。如果您仔细阅读错误消息,它将告诉您阻止元素的HTML,这将有助于您在页面上找到它。如果没有更多信息,很难准确说明情况,但有一些常见原因。

  1. 您可能刚刚关闭了一个对话框/弹出窗口,但在尝试点击之前它还没有完全消失。在这种情况下,等待对话框的一部分不可见的某些元素通常可以解决这个问题。

  2. 可能会有一些等待/加载/微调器控件出现并消失,但是在它完全消失之前你点击了。解决方案与#1相同,等待微调器的一部分不可见。

  3. 可能有一些UI元素,如页眉,页脚,侧边栏浮动,覆盖您尝试点击的元素,如果它在页面的最底部/顶部/等处。这些可能是一个真正的痛苦,因为你永远不知道元素何时会对齐和被覆盖。一种解决方案是使用JS滚动页面多一点。例如,如果脚本位于页面顶部,并且您想单击底部的某些内容。单击一下将滚动页面以显示该元素,但该元素将元素放在页面的最底部并位于浮动页脚下。您尝试单击但捕获异常。由于您知道自己位于页面底部,因此向下滚动页面X像素。这会从浮动页脚后面显示您想要的元素,现在您可以单击它。

  4. 注意:如果您要在等待后立即点击元素,则应使用.elementToBeClickable(locator)代替.visibilityOfElementLocated()。它不会解决您当前的问题,但它会更加完整和正确地等待您想要做的事情。