在Selenium C#中重用Page Object中的属性

时间:2018-01-22 16:27:24

标签: c# selenium

我正在考虑使用Selenium和C#进行自动化测试

我正在使用页面对象模式,并希望重用元素定位器属性。让我用一个例子来解释:

public class AdminSection
    {
        [FindsBy(How = How.Id, Using = "**Admincity**")]
        public IWebElement City{ get; set; }
    }

public class UserSection
    {
        [FindsBy(How = How.Id, Using = "**usercity**")]
        public IWebElement City{ get; set; }
    }

public class MyPage
    {
//Section could be either admin or User based on the page        
ISection = AdminSection OR UserSection;
    }

这里我有一个页面,我有一个“部分”,我想重用名称,城市,地址等属性。但是,不同的页面具有不同的元素ID。 有没有办法重用属性Name&城市在运行时具有不同的元素定位器?使用一些抽象?

我想通过创建两个单独的类来避免上面的重复操作?我不能使用FindBy XPath,因为XPath地址在两个页面上都不一样,而且它会很脆弱。

谢谢, 的Manoj

2 个答案:

答案 0 :(得分:0)

我建议你不要这样做。即使它们具有一些/所有相同的定位器,也要单独处理每个页面。如果页面确实具有相同的定位器,则可能是巧合。在某些时候,其中一个页面可能会发生变化,这将迫使您仅更新该页面的定位器。当你分享它们时,你必须分开一切,否则事情会变得更加复杂。

你可能会花更多的时间试图找到一种方式来分享它们并以一种方式编写它们,使它们在所有页面上工作,而不是只复制/粘贴那些在单独的页面对象中也是如此。

答案 1 :(得分:0)

Manoj - 感谢您回答问题。根据你所说的,我可能会这样创造它。它听起来像一个SPA,它是一个单页应用程序?我可能仍然会为Admin和User创建一个不同的页面对象类,并相应地调用它们。

然后,您可以构建调用页面和方法的specflow步骤。

示例:

    adminPage

    [FindsBy(How = How.Id, Using = "City")]
    private readonly IWebElement _adminCity = null;

    //methods
    public void TypeAdminCity(string value)
    {
        browser.Type(_adminCity, value);
    }

    UserPage

    [FindsBy(How = How.Id, Using = "userCity")]
    private readonly IWebElement _userCity = null;

    //methods
    public void TypeUserCity(string value)
    {
        browser.Type(_userCity, value);
    }