具有静态页面对象模型的Selenium Automation

时间:2020-01-31 21:21:54

标签: c# selenium-webdriver automation static-methods pageobjects

我一直在看很多带有Page Objects Model的示例Selenium框架,它们通常显示:

[Test]
public void Test_Login_To_Home_Page()
{
  var login = new LoginPage(this.driver);
  login.LoginAs(“user”, “password1”); 

  var home = new HomePage(this.driver);
  home.GoTo();
  Assert.IsTrue(home.IsAt(), "failed to login successfully");
}

如果页面对象类中的内容(方法,Web元素)是静态的,并且暴露给驱动程序类的Instance,则它看起来像:

[Test]
public void Test_Login_To_Home_Page()
{
  LoginPage.LoginAs(“user”, “password1”); 
  HomePage.GoTo();
  Assert.IsTrue(HomePage.IsAt(), "failed to login successfully");
}

我看不到通过创建页面对象类的实例所获得的收益。后一种方法看起来更干净,它消除了测试中的大量噪音,并且更容易训练缺乏编程技能的缺乏经验的自动化测试人员。

使用后一种方法是否有固有的缺点?我想不出任何办法,但似乎无处促进这种方法,他们似乎都使用了前一种方法。有什么缺点吗?

如何调用驱动程序以在页面对象中查找元素的示例:

using static SeleniumWebDriver;

public class housesPage
{

private static IWebElement houses_SelectMenu => Instance.FindElement(By.Id("housesSelect"));

,并在SeleniumWebDriver类中:

public static class SeleniumWebDriver
{

public static IWebDriver Instance { get; set; }

public static IWebDriver CreateWebDriver()
{
 Instance = CreateChromeDriver();
 return Instance;

1 个答案:

答案 0 :(得分:1)

我看到一个很大的缺点-您无法并行运行测试。如果您拥有静态驱动程序,那么您一次只能执行一个测试。测试规则之一是测试不应依赖于任何其他测试。会被违反。

那有什么选择呢?我更喜欢将方法链接起来,以使其更加流畅。 假设LoginPage看起来像这样:

public class LoginPage
{
    private IWebDriver _driver;
    public LoginPage(IWebDriver driver)
    {
        _driver = driver;
    }
    public HomePage LoginAs(string user, string password)
    {
        // Providing user and password and clicking login button
        return new HomePage(_driver);
    }
}

首页:

public class HomePage
{
    private IWebDriver _driver;
    public HomePage(IWebDriver driver)
    {
        _driver = driver;
    }
    public HomePage GoTo()
    {
        // Do something
        return this;
    }
    public bool IsAt()
    {
        return true;
    }
}

我还建议使用FluentAssertion。 有了这些,测试看起来就像:

[Test]
public void Test_Login_To_Home_Page()
{
    new LoginPage(this.driver)
        .LoginAs("user", "password")
        .GoTo()
        .IsAt()
        .Should()
        .BeTrue();
}