我正在与自动化一起工作,一次又一次遇到问题。通常,我在代码中有逻辑,需要检查元素是否存在,下一步将取决于检查结果。但是Selenium的基本工具仅返回布尔值true,否则返回NoSuchElementException。但是我需要“假”。
与之前的项目一样,我现在使用简单的包装器解决此问题:
private boolean isDisplayedOnPage(WebElementFacade wef){
try{
return wef.isDisplayed();
} catch (NoSuchElementException nsee){
return false;
}
}
它工作得很好,但是使用异常使我感到困惑。另外,我读到有关“等待”的信息,但它也不会返回false,只能让我忽略该异常。 Selenium中是否有用于解决此问题的内置工具?还是有人可以提供一种更优雅的解决方法?
答案 0 :(得分:3)
原始WebDriver API的核心原则之一是期望用户知道自动化页面的DOM状态。这意味着,按照API的逻辑,使用不存在的元素的定位符调用findElement
是一种例外情况,从而使抛出异常完全合法。尽管有人可能会说API行为内置的期望是错误的,但这超出了此答案的范围。如果您需要布尔逻辑来判断某个元素是否存在,则需要一个包装器方法,正如您已经发现的那样。在该包装方法中,您有两种选择:
使用findElement
并捕获NoSuchElementException
。请注意,使用WebDriverWait
会为您隐式捕获此异常,语义等效项也是如此。
使用findElements
(请注意“ s”),如果元素不存在,它将返回一个空列表而不会引发异常。
答案 1 :(得分:3)
//add boundary time notification
boundaryTimeObserver = avLayer.player!.addBoundaryTimeObserver(forTimes: [NSValue(time: avLayer.player!.currentItem!.duration)], queue: DispatchQueue.main){
self.avLayer.player!.pause()
}
这将为您提供帮助。
答案 2 :(得分:0)
一种不完善的解决方法是检查DOM中是否有一个唯一的字符串,该字符串表示您的WebElement,然后将其写入布尔值(如果可以找到)。
如果找不到任何内容,此循环将每秒检查DOM字符串约60次,并刷新页面:
for (int i= 0; i <60; i++){
String pageSource = browser.getPageSource().toString();
boolean elementThere = pageSource.contains("uniqueStringOfElement");
if (elementThere){
browser.WebElement.click()
break;
}
else {
Thread.sleep(1000);
browser.navigate().refresh();
}
}