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

如何将页面对象与 Webdriver 一起使用时检查元素是否存在。

到目前为止,我正在这样做。

DefaultPage defaultPage = PageFactory.initElements(this.driver,
      DefaultPage.class);
assertTrue(defaultPage.isUserCreateMenuLinkPresent());

页面对象:

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;
        }
    }
 }

但是我不敢相信这种尝试/捕获是一个人应该这样做的方式。那么,检查元素是否退出(使用页面对象)的更好方法是什么?


答案 1

问题在于模式本身。它使用@FindBy注释(由PageFactory用于初始化必须由代理包装的字段),它将标准元素替换为包含InvocationHandler的代理实例。

每次尝试访问带有@FindBy注释的字段时,调用处理程序都会尝试使用默认的 ElementLocator 查找该元素。问题是,如果 DOM 中没有提供任何元素,则 ElementLocator.findElement() 方法会引发 TimeoutException/NoSuchElementException。

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
}

解决此问题的另一种方法是创建自己的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
...

并向 LocatingElementHandler.invoke() 添加新条件

像这样:

element = locator.findElement()
if(element == null){
   if(method.name == "isDisplayed"){
      return false
   }
}

答案 2

Webdriver旨在在找不到元素时引发异常,因此没有任何方法可以验证Webdriver中是否存在元素。

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