WebDriver:如何检查页面对象Web元素是否存在?

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)

解决此问题的另一种方法是创建自己的LocatingElementHandlerElementLocator实现

因此,如果您需要自己的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)


dmp*_*dmp 4

Webdriver 被设计为在未找到元素时抛出异常,因此没有任何方法可以验证 Webdriver 中元素是否存在。

检查这个 - http://groups.google.com/group/webdriver/browse_thread/thread/909a9b6cb568e341

  • 所以你的意思是:没有办法检查页面对象中是否存在 Web 元素,除非尝试调用代理上的方法,该方法可能会失败,因为该代理后面没有实例? (4认同)