如何检查 PageObject 的所有元素是否有效(Java、Serenity、Cucumber)
How to check if all elements of a PageObject are valid (Java, Serenity, Cucumber)
我正在用 cucumber 编写场景测试用例,我想在 运行 测试之前检查 PageObject 的所有元素是否有效以及 selenium 是否可以与它们交互。我想避免 运行 宁我的多步骤、长测试用例只是为了到达最后一页并得到一个元素未找到的异常。我希望能够在编写后测试我的 PageObject,这样我就可以确定所有元素都可以访问(在 运行 进行长时间测试之前..)。
我正在使用的网站没有一致的 id 标签,使用 @FindBy() 有时需要一些时间。我正在尝试做一个简单的过程:
- 导航到 PageObject url
- 检查 selenium 是否可以访问 PageObject 中的所有元素
您是否知道一种无需为每个元素创建方法即可访问所有 PageObjects 元素的方法?一个初始化所有元素的方法?
在尝试了多种不同的方法后,我在 class 中使用反射来拉取所有字段,然后使用 .isPresent();
检查元素是否在页面上。此解决方案要求将此方法放置在您要测试的每个 class 中,而我试图避免这种情况。
解决方案:
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
测试Class
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();
}
}
第Class页
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());
}
}
}
}
}
我正在用 cucumber 编写场景测试用例,我想在 运行 测试之前检查 PageObject 的所有元素是否有效以及 selenium 是否可以与它们交互。我想避免 运行 宁我的多步骤、长测试用例只是为了到达最后一页并得到一个元素未找到的异常。我希望能够在编写后测试我的 PageObject,这样我就可以确定所有元素都可以访问(在 运行 进行长时间测试之前..)。
我正在使用的网站没有一致的 id 标签,使用 @FindBy() 有时需要一些时间。我正在尝试做一个简单的过程:
- 导航到 PageObject url
- 检查 selenium 是否可以访问 PageObject 中的所有元素
您是否知道一种无需为每个元素创建方法即可访问所有 PageObjects 元素的方法?一个初始化所有元素的方法?
在尝试了多种不同的方法后,我在 class 中使用反射来拉取所有字段,然后使用 .isPresent();
检查元素是否在页面上。此解决方案要求将此方法放置在您要测试的每个 class 中,而我试图避免这种情况。
解决方案:
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
测试Class
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();
}
}
第Class页
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());
}
}
}
}
}