我的脚本会创建一篇新文章:填写少量字段,然后点击页面末尾的“提交按钮”。
我在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不会自动滚动,它会找到元素并执行操作。
答案 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相同,等待微调器的一部分不可见。
可能有一些UI元素,如页眉,页脚,侧边栏浮动,覆盖您尝试点击的元素,如果它在页面的最底部/顶部/等处。这些可能是一个真正的痛苦,因为你永远不知道元素何时会对齐和被覆盖。一种解决方案是使用JS滚动页面多一点。例如,如果脚本位于页面顶部,并且您想单击底部的某些内容。单击一下将滚动页面以显示该元素,但该元素将元素放在页面的最底部并位于浮动页脚下。您尝试单击但捕获异常。由于您知道自己位于页面底部,因此向下滚动页面X像素。这会从浮动页脚后面显示您想要的元素,现在您可以单击它。
注意:如果您要在等待后立即点击元素,则应使用.elementToBeClickable(locator)
代替.visibilityOfElementLocated()
。它不会解决您当前的问题,但它会更加完整和正确地等待您想要做的事情。