Java 使用SeleniumWebDriver在页面对象模式中写入检查元素逻辑的位置
我有两个包,一个代表测试的类,另一个代表页面对象 在测试类中,我想开发一种逻辑,其中如果存在一个元素,即下拉列表,则遵循一条路径,如果没有,则遵循另一条路径,然后验证结果 虽然我看到页面对象模式将用于与页面上的元素交互,但是测试逻辑应该走到哪里,这同样取决于web元素(dropdwwn是否存在) 如果我们开始检查测试类中是否存在元素,然后将驱动程序对象传递给页面对象类,那么这不是重复工作 当逻辑是基于网页上是否存在某些Web元素时,我不确定什么是正确的设计方法Java 使用SeleniumWebDriver在页面对象模式中写入检查元素逻辑的位置,java,design-patterns,selenium-webdriver,testng,Java,Design Patterns,Selenium Webdriver,Testng,我有两个包,一个代表测试的类,另一个代表页面对象 在测试类中,我想开发一种逻辑,其中如果存在一个元素,即下拉列表,则遵循一条路径,如果没有,则遵循另一条路径,然后验证结果 虽然我看到页面对象模式将用于与页面上的元素交互,但是测试逻辑应该走到哪里,这同样取决于web元素(dropdwwn是否存在) 如果我们开始检查测试类中是否存在元素,然后将驱动程序对象传递给页面对象类,那么这不是重复工作 当逻辑是基于网页上是否存在某些Web元素时,我不确定什么是正确的设计方法 谢谢。写一个单独的类,比如说UTI
谢谢。写一个单独的类,比如说UTIL来保存这些逻辑。还可以将此UTIL类用于所有测试数据生成和错误代码处理。基本思想是执行以下操作:
try{
element.isDisplayed();
return true;
} catch(ElementNotFoundException e){
return false;
}
我找到了两个用于此代码的位置:
第一个是在page类中,所有页面都继承该类。如果没有这样的类,那么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
这可能超出了您的要求,如果是的话,顶级功能就是您想要的。我真的认为这不是一个好方法。您应该知道元素在哪种情况下存在。但如果这是唯一的方法,我建议在测试类中创建逻辑,并根据结果调用所需的方法。我认为最好在页面类中创建方法,以使用webelement执行操作。通过这种方式,您可以在执行操作之前确定元素是否存在,如果存在,则只执行操作,否则抛出异常。