使用具有相同 selenium 测试的不同页面对象集
Using different sets of page objects with the same selenium tests
[这是与 SQA 交叉发布的 - https://sqa.stackexchange.com/questions/35081/using-different-sets-of-page-objects-with-the-same-selenium-tests]
我正在为一组类似的网站开发 selenium 测试套件。测试套件将针对每个网站单独执行,套件中的测试适用于所有网站。
这些网站建立在相同的底层平台上,但具有不同的 theme/scheme,因此这些网站的页面对象需要不同。这不是一个或两个选择器不同的情况,而是大多数选择器不同——但结构的其余部分是相同的。
我可以轻松地创建两组(或三组,或其他)页面对象,但是我不知道如何告诉测试执行程序(在我的例子中是 Cucumber cli)要使用哪些页面对象。
我能想到的最接近的方法是使用具有公共基础 类 的不同包名称,然后使用从公共基础 类 扩展的各个页面。另一种可能性是将所有选择器提取到 属性 文件中,并根据输入参数加载一个或另一个,但这会使我无法使用 PageFactory。我也可以,也许,在不同的源集中创建单独的页面对象集,然后根据我的需要编译一个或另一个——但是,同样,我可以想到理论,但不能执行。
那么,什么是正确的方法以及如何实现呢?如果重要,该项目是使用 gradle.
构建的
由于测试适用于所有站点,因此我假设页面之间的唯一区别是对象后面的选择器。
cssSelector
和 xpath
提供 or
。假设文本字段的 ID id1
、id2
或 id3
取决于您可以使用的页面
@FindBy(how = How.CSS, using = "#id1, #id2, #id3")
private WebElement textField;
这将 return WebElement
匹配其中一个 ID。
解决方案原来是自定义ElementLocator和ElementLocatorFactory,并带有相应的自定义注解。这需要更多的工作,但这是一个非常清晰的解决方案。我在 github 上发布了它。简而言之,实现允许这样做:
public class MyPage {
@SearchWith(page="MyPage", name="myElement", locatorsFile="{locators}")
WebElement someElement
...
}
然后 运行 使用 -Dlocators=site1.json
或 -Dlocators=site2.json
的整个测试 - 相应的定位器将从一个或另一个加载。它甚至允许指定 -Dlocators=[site3.json]
并从 site3.json
资源加载定位器(使用 this.getClass().getResourceAsStream(locatorsFile)
获得)
[这是与 SQA 交叉发布的 - https://sqa.stackexchange.com/questions/35081/using-different-sets-of-page-objects-with-the-same-selenium-tests]
我正在为一组类似的网站开发 selenium 测试套件。测试套件将针对每个网站单独执行,套件中的测试适用于所有网站。
这些网站建立在相同的底层平台上,但具有不同的 theme/scheme,因此这些网站的页面对象需要不同。这不是一个或两个选择器不同的情况,而是大多数选择器不同——但结构的其余部分是相同的。
我可以轻松地创建两组(或三组,或其他)页面对象,但是我不知道如何告诉测试执行程序(在我的例子中是 Cucumber cli)要使用哪些页面对象。
我能想到的最接近的方法是使用具有公共基础 类 的不同包名称,然后使用从公共基础 类 扩展的各个页面。另一种可能性是将所有选择器提取到 属性 文件中,并根据输入参数加载一个或另一个,但这会使我无法使用 PageFactory。我也可以,也许,在不同的源集中创建单独的页面对象集,然后根据我的需要编译一个或另一个——但是,同样,我可以想到理论,但不能执行。
那么,什么是正确的方法以及如何实现呢?如果重要,该项目是使用 gradle.
构建的由于测试适用于所有站点,因此我假设页面之间的唯一区别是对象后面的选择器。
cssSelector
和 xpath
提供 or
。假设文本字段的 ID id1
、id2
或 id3
取决于您可以使用的页面
@FindBy(how = How.CSS, using = "#id1, #id2, #id3")
private WebElement textField;
这将 return WebElement
匹配其中一个 ID。
解决方案原来是自定义ElementLocator和ElementLocatorFactory,并带有相应的自定义注解。这需要更多的工作,但这是一个非常清晰的解决方案。我在 github 上发布了它。简而言之,实现允许这样做:
public class MyPage {
@SearchWith(page="MyPage", name="myElement", locatorsFile="{locators}")
WebElement someElement
...
}
然后 运行 使用 -Dlocators=site1.json
或 -Dlocators=site2.json
的整个测试 - 相应的定位器将从一个或另一个加载。它甚至允许指定 -Dlocators=[site3.json]
并从 site3.json
资源加载定位器(使用 this.getClass().getResourceAsStream(locatorsFile)
获得)