Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SeleniumWebDriver在页面对象模式中写入检查元素逻辑的位置_Java_Design Patterns_Selenium Webdriver_Testng - Fatal编程技术网

Java 使用SeleniumWebDriver在页面对象模式中写入检查元素逻辑的位置

Java 使用SeleniumWebDriver在页面对象模式中写入检查元素逻辑的位置,java,design-patterns,selenium-webdriver,testng,Java,Design Patterns,Selenium Webdriver,Testng,我有两个包,一个代表测试的类,另一个代表页面对象 在测试类中,我想开发一种逻辑,其中如果存在一个元素,即下拉列表,则遵循一条路径,如果没有,则遵循另一条路径,然后验证结果 虽然我看到页面对象模式将用于与页面上的元素交互,但是测试逻辑应该走到哪里,这同样取决于web元素(dropdwwn是否存在) 如果我们开始检查测试类中是否存在元素,然后将驱动程序对象传递给页面对象类,那么这不是重复工作 当逻辑是基于网页上是否存在某些Web元素时,我不确定什么是正确的设计方法 谢谢。写一个单独的类,比如说UTI

我有两个包,一个代表测试的类,另一个代表页面对象

在测试类中,我想开发一种逻辑,其中如果存在一个元素,即下拉列表,则遵循一条路径,如果没有,则遵循另一条路径,然后验证结果

虽然我看到页面对象模式将用于与页面上的元素交互,但是测试逻辑应该走到哪里,这同样取决于web元素(dropdwwn是否存在)

如果我们开始检查测试类中是否存在元素,然后将驱动程序对象传递给页面对象类,那么这不是重复工作

当逻辑是基于网页上是否存在某些Web元素时,我不确定什么是正确的设计方法


谢谢。

写一个单独的类,比如说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执行操作。通过这种方式,您可以在执行操作之前确定元素是否存在,如果存在,则只执行操作,否则抛出异常。