1

[这是与 SQA 交叉发布的 - https://sqa.stackexchange.com/questions/35081/using-different-sets-of-page-objects-with-the-same-selenium-tests]

我正在为一组类似的网站开发硒测试套件。测试套件将针对每个站点单独执行,并且套件中的测试适用于所有网站。

这些网站建立在相同的底层平台上,但是具有不同的主题/方案,因此这些网站的页面对象需要不同。这不是一个或两个选择器不同的情况,而是大多数选择器不同 - 但结构的其余部分是相同的。

我可以轻松地创建两组(或三组,或其他)页面对象,但是我不知道如何告诉测试执行器(在我的例子中是 Cucumber cli)要使用哪些页面对象。

我能想到的最接近的方法是使用具有公共基类的不同包名称,然后使用从公共基类扩展的各个页面。另一种可能性是将所有选择器提取到属性文件中,并根据输入参数加载一个或另一个,但这会阻止我使用 PageFactory。我也可以,可能,在不同的源集中创建单独的页面对象集,然后根据我的需要编译一个或另一个 - 但是,我可以再次想到理论,而不是执行。

那么,什么是正确的方法以及如何实现呢?如果重要,项目是使用 gradle 构建的。

4

2 回答 2

0

由于测试适用于所有站点,我假设页面之间的唯一区别是对象后面的选择器。

cssSelectorxpath提供or. 假设文本字段具有 ID id1id2或者id3取决于您可以使用的页面

@FindBy(how = How.CSS, using = "#id1, #id2, #id3")
private WebElement textField;

这将返回WebElement匹配的 id 之一。

于 2018-08-06T08:16:12.847 回答
0

解决方案原来是自定义 ElementLocator 和 ElementLocatorFactory 与相应的自定义注释。这是一个多一点的工作,但它是一个非常明确的解决方案。我在github上发布了它。简而言之,实现允许这样做:

public class MyPage {
    @SearchWith(page="MyPage", name="myElement", locatorsFile="{locators}")
    WebElement someElement

    ...
}

-Dlocators=site1.json然后用or -运行整个测试,-Dlocators=site2.json相应的定位器将从一个或另一个加载。它甚至允许从资源中指定-Dlocators=[site3.json]和加载定位器(使用 获得)site3.jsonthis.getClass().getResourceAsStream(locatorsFile)

于 2018-11-29T14:46:06.250 回答