Ral*_*lph 20 java testing webdriver selenium-webdriver
当使用带有webdriver的页面对象时,如何检查元素是否存在.
到目前为止,我这样做.
DefaultPage defaultPage = PageFactory.initElements(this.driver,
DefaultPage.class);
assertTrue(defaultPage.isUserCreateMenuLinkPresent());
Run Code Online (Sandbox Code Playgroud)
页面对象:
public class DefaultPage {
@FindBy(id = "link_i_user_create")
private WebElement userCreateMenuLink;
public boolean isUserCreateMenuLinkPresent() {
try {
this.userCreateMenuLink.getTagName();
return true;
} catch (NoSuchElementException e) {
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我无法相信这种尝试/捕获是人们应该这样做的方式.那么什么是更好的方法来检查元素是否退出(使用页面对象)?
小智 5
问题在于模式本身.它使用@FindBy批注(由PageFactory用于初始化必须由Proxy包装的字段),用其包含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);
}
Run Code Online (Sandbox Code Playgroud)
因此,每次需要检查元素是否显示时,都必须搜索元素列表并检查其大小.
@FindBy(css = "div.custom")
private List<WebElement> elements
...
public isElementPresented(){
return elements != null && elements.size > 0
}
Run Code Online (Sandbox Code Playgroud)
解决此问题的另一种方法是创建自己的LocatingElementHandler和ElementLocator实现
因此,如果您需要自己的isDisplayed()方法来返回false而不是Exception,则必须使用以下内容替换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
...
Run Code Online (Sandbox Code Playgroud)
并为LocatingElementHandler.invoke()添加新条件
就像是:
element = locator.findElement()
if(element == null){
if(method.name == "isDisplayed"){
return false
}
}
Run Code Online (Sandbox Code Playgroud)
Webdriver 被设计为在未找到元素时抛出异常,因此没有任何方法可以验证 Webdriver 中元素是否存在。
检查这个 - http://groups.google.com/group/webdriver/browse_thread/thread/909a9b6cb568e341
| 归档时间: |
|
| 查看次数: |
46425 次 |
| 最近记录: |