我创建了以下方法:
public void waitAndClickElement(WebElement element) throws InterruptedException {
try {
Boolean elementPresent = this.wait.until(ExpectedConditions.elementToBeClickable(element)).isEnabled();
if (elementPresent == true && element.isDisplayed()) {
element.click();
System.out.println("Clicked on the element: " + element.getText());
}
} catch (StaleElementReferenceException elementUpdated) {
Boolean elementPresent = wait.until(ExpectedConditions.stalenessOf(element));
if (elementPresent == true) {
WebElement staleElement = element;
staleElement.click();
System.out.println("Clicked on the 'Stale' element: " + element.getText());
}
} catch (NoSuchElementException e) {
System.out.println("Exception! - Could not click on the element: " + element.getText() + ", Exception: "+ e.toString());
throw (e);
} finally {
}
}
但我似乎仍然得到以下例外情况:
预期条件失败:等待元素(代理元素:DefaultElementLocator'By.xpath:// [text()='立即交换»']')变得陈旧(尝试20秒,500秒) MILLISECONDS间隔)
但同样的方法可以说20个版本中的18个,任何想法?
感谢您的帮助
答案 0 :(得分:1)
如果您使用其他driver.get("http://completely.different.site.com/");
更改网站,则此元素将过时(不再在DOM中)。陈旧性意味着DOM中的元素无法访问。
答案 1 :(得分:1)
你的问题的直接答案是你正在等待已经陈旧的元素变得陈旧。我不确定你的意图是什么。
您的功能过于复杂,并且无法按照您的想法行事。
如果某个元素是可点击的,它也会启用并显示,因此您无需检查这三个元素。如果该元素正在抛出StaleElementReferenceException
,那么它将不会成为" unstale。"
我建议您使用以下内容替换当前功能。
public void waitAndClickElement(By locator)
{
try
{
this.wait.until(ExpectedConditions.elementToBeClickable(locator)).click();
}
catch (TimeoutException e)
{
System.out.println("Count not click element <" + locator.toString() + ">");
}
}
传递定位器而不是元素而不是元素本身,这将简化很多事情。如果元素存在且可单击,则将单击该元素。如果它不存在或永远不会变为可点击,它将抛出你可以捕获的TimeoutException
。
此外,编写element.toString()
将为元素编写一些ID,这些ID不会是人类可读或有意义的。你最好写locator.toString()
,它会返回定位器的类型,例如: By.cssSelector: #hplogo
。