代码之家  ›  专栏  ›  技术社区  ›  Aleks G

使用具有相同selenium测试的不同页面对象集

  •  1
  • Aleks G  · 技术社区  · 7 年前

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

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

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

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

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

    那么,正确的方法是什么以及如何实现?如果重要的话,这个项目是用gradle建造的。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Guy    7 年前

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

    cssSelector xpath 提供 or . 假设文本字段具有ID id1 , id2 id3 取决于您可以使用的页面

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

    这将返回 WebElement 匹配其中一个ID。

        2
  •  0
  •   Aleks G    7 年前

    结果证明,解决方案是一个自定义的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) )