【问题标题】:Selenium Automation with static Page Object ModelSelenium 自动化与静态页面对象模型
【发布时间】:2020-05-17 13:34:36
【问题描述】:

我一直在查看许多带有页面对象模型的 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 元素)是静态的,并且它们暴露给驱动程序类的实例,它看起来像:

[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;

【问题讨论】:

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


    【解决方案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();
    }
    

    【讨论】:

    • 感谢 Jonah,有趣的回应。我不知道我是否解释了我如何正确访问驱动程序类,我添加了更多信息。你的 cmets 还站着吗?抱歉,我还在学习 OOP。
    • 你试过你的方法吗,不止一个测试?如果它是静态的,并且许多测试将使用相同的驱动程序,那么它会导致问题。
    • 感谢它在测试并行运行时摔倒了,所以我认为这回答了这个问题。我想这只是在同一节点上运行并行测试时的一个问题。有趣的是,我似乎无法在网上找到任何解决方案,让非静态 Webdriver 类实现线程安全并行测试。
    • _ 我似乎无法在网上找到任何解决方案,让非静态 Webdriver 类实现线程安全并行测试_ - 我在每个测试中初始化 WebDriver,然后将该驱动程序传递给页面对象。多亏了它,每个测试都有自己的驱动程序,因此可以节省并行运行它们。有关更多想法,我建议查看 Wikia GitHub,他们有强大的测试框架 github.com/Wikia/selenium-tests
    • 谢谢你,它为我指明了一些非常有用的方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2016-07-24
    • 2018-02-20
    • 2022-09-27
    • 2018-07-13
    • 1970-01-01
    相关资源
    最近更新 更多