問題是模式本身。它使用@FindBy註釋(由PageFactory用於初始化必須由代理包裝的字段),用它們的包含InvocationHandler的代理實例替換標準元素。
每次嘗試訪問使用@FindBy註釋的字段時,調用處理程序都會嘗試使用默認的ElementLocator查找元素。問題是,如果存在,則ElementLocator.findElement()方法會引發TimeoutException/NoSuchElementException DOM中沒有元素。
public WebElement findElement(SearchContext context) {
List<WebElement> allElements = findElements(context);
if (allElements == null || allElements.isEmpty())
throw new NoSuchElementException("Cannot locate an element using "
+ toString());
return allElements.get(0);
}
因此,每次你需要檢查是否顯示元素或沒有你要搜索的內容的列表,並檢查它的大小。
@FindBy(css = "div.custom")
private List<WebElement> elements
...
public isElementPresented(){
return elements != null && elements.size > 0
}
解決這個問題的另一種方法是創建自己的實現LocatingElementHandler和ElementLocator的
所以,如果你需要自己isDisplayed()方法返回,而不是例外假的,你必須用ElementLocator中的findElement()方法替換:
...
List<WebElement> elements = searchContext.findElements(by)
if(elements != null && elements.size() > 0){
List<WebElement> visibleElements = []
elements.each {
if(it.displayed){
visibleElements.add(it)
}
}
if(visibleElements.size() > 0){
return visibleElements.get(0)
}
}
return null
...
並將新條件添加到LocatingElemen tHandler。調用()
喜歡的東西:
element = locator.findElement()
if(element == null){
if(method.name == "isDisplayed"){
return false
}
}
如果你的問題是檢查元素的可見性,這可能有所幫助:http://stackoverflow.com/questions/2646195/how-to-check-if-an-element-is-visible-with-webdriver – phtrivier
@phrivier:不,這不起作用,因爲這個問題不是關於可見的,而是關於存在。 – Ralph
是否可以接受由註釋注入的另一個元素(一個像root一樣存在)並使用rootELement.findElements(ByWhatever).isEmpty()? – phtrivier