0

我正在黄瓜中编写场景测试用例,我想在运行测试之前检查 PageObject 的所有元素是否有效并且 selenium 是否可以与它们交互。我想避免运行我的多步骤、长测试用例只是为了到达最后一页并得到一个找不到元素的异常。我希望能够在编写 PageObject 之后对其进行测试,因此我可以确定所有元素都是可访问的(在运行长时间测试之前......)。

我正在处理的网站没有一致的 id 标签,使用 @FindBy() 有时需要一些时间。我正在尝试做一个简单的过程:

  1. 导航到 PageObject url
  2. 检查 PageObject 中的所有元素是否都可以被 selenium 访问

您知道一种无需为每个元素创建方法即可访问所有 PageObjects 元素的方法吗?初始化所有元素的方法?

4

1 回答 1

0

在尝试了多种不同的方法后,我在类中使用反射来拉取所有字段,然后用于.isPresent();检查元素是否在页面上。此解决方案要求将此方法放置在您要测试的每个类中,这是我试图避免的。

解决方案:

SuiteRunner

@RunWith(CucumberWithSerenity.class)
@CucumberOptions(features = "src/test/resources/features/checkElems")
public class RegressionTestSuite {}

功能文件:CanFindElems.feature

Feature: Check if WebPage Object elements can be found

  Scenario: Check if the page's elements are reachable
    Given navigate to webpage
    Then check page elements

测试班

public class CanFindElemsTest {

  // Change the class
  ClassYouAreTesting page;

  @Given("^navigate to webpage$")
  public void navigate_to_webpage() throws Exception {

    page.open();
  }


  @Then("^check page elements$")
  public void check_page_elements() throws Exception {

    page.checkPageElementsExist();
  }
}

页面类

public class SomeWebPage extends PageObject {

  @FindBy(id = "someID")
  private WebElementFacade someElement;

  @FindBy(linkText = "some text")
  private WebElementFacade someLink;

  @FindBy(className = "some-class")
  private WebElementFacade anotherElement;


  public void checkPageElementsExist() throws Exception {

    Field[] allFields = getClass().getDeclaredFields();
    for (Field field : allFields) {

      if (field.get(this) instanceof WebElementFacade) {

        WebElementFacade f = (WebElementFacade) field.get(this);

        if (!f.isPresent()) {

          System.out.println("ElementNotFound: " + field.getName());
        } else {

          System.out.println("Found: " + field.getName());
        }
      }
    }
  }

}
于 2019-04-24T17:58:25.890 回答