0

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

在测试类中,我想开发一个逻辑,如果存在一个元素,即说一个下拉菜单,则遵循一条路径,如果不存在则遵循另一条路径,然后验证结果

虽然我看到页面对象模式将用于与页面上的元素进行交互,但测试逻辑应该在哪里再次取决于 Web 元素(是否存在 dropdwwn)。

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

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

谢谢。

4

2 回答 2

1

编写一个单独的类,例如 UTIL 来保存这些逻辑。还可以使用此 UTIL 类来生成所有测试数据和错误代码处理。

于 2013-07-26T09:48:19.603 回答
0

基本思想是做类似的事情:

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

这可能超出了您的要求,如果是,那么您正在寻找的就是顶级功能。

于 2013-07-26T14:58:43.500 回答