基本思想是做类似的事情:
try{
element.isDisplayed();
return true;
} catch(ElementNotFoundException e){
return false;
}
我为这段代码找到了两个地方:
第一个是在您的所有页面都继承的页面类中。如果您没有这样的课程,那么 Utils 课程将起作用。然后,您的函数调用将类似于page.exists(page.getSaveButton())
.
但是,我最喜欢的方法(需要更多设置)是围绕 WebElement 编写一个包装类(我称之为 EnhancedWebElement)。它的构造函数接受一个普通的 WebElement,并将每个函数调用重定向到 WebElement,并具有一个 exists() 函数。
最后,为了让每个元素都有 exists() 函数,你需要扩展 DefaultFieldDecorator,并覆盖这些函数:
@Override
public Object decorate(ClassLoader loader, Field field) {
if (!(WebElement.class.isAssignableFrom(field.getType())
|| isDecoratableList(field))) {
return null;
}
ElementLocator locator = factory.createLocator(field);
if (locator == null) {
return null;
}
if (EnhancedWebElement.class.isAssignableFrom(field.getType())) {
return proxyForLocator(loader, locator);
} else if (List.class.isAssignableFrom(field.getType())) {
return proxyForListLocator(loader, locator);
} else {
return null;
}
}
@Override
protected EnhancedWebElement proxyForLocator(ClassLoader loader, ElementLocator locator) {
InvocationHandler handler = new LocatingElementHandler(locator);
WebElement proxy= (WebElement) Proxy.newProxyInstance(
loader, new Class[] {WebElement.class, WrapsElement.class, Locatable.class}, handler);
return new EnhancedWebElement(proxy);
}
要实现它,无论您在哪里调用 initElements,都可以调用它:
PageFactory.initElements(new EnhancedFieldDecorator(new DefaultElementLocatorFactory(driver)), this);
//Replace EnhancedFieldDecorator with the name of your decorator
这可能超出了您的要求,如果是,那么您正在寻找的就是顶级功能。