当前位置: 首页 > 知识库问答 >
问题:

具有静态页面对象模型的Selenium自动化

经炜
2023-03-14

我已经看过很多带有页面对象模型的示例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;

共有1个答案

壤驷雅达
2023-03-14

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

那么选择是什么呢?我更喜欢连锁的方法,使它更流畅。让我们假设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();
}
 类似资料:
  • 在Selenium中,我们可以将对象存储库维护为页面对象模型。但是我们可以通过将变量定义为publicstaticfinal来维护或通过一个单独的类,并在需要时在其他类中使用。 对于例如。 并在代码中使用与 有人能帮我理解区别吗?什么是更好的方法?

  • 我有一个列数可变的表(取决于客户),所以我在寻找一种使用JPA/Hibernate或其他方法将该表与java对象映射的方法 我不能使用POJO,因为它仅限于一个稳定的表,所以我想像这样使用java对象 } 存储MyObject的表: 当然还有质疑的可能性

  • 我遵循这里的POM指南 问题是当输入有效的用户/密码时,POM正在返回新的HomePage(驱动程序),新的HomePage构造函数正在通过传递的驱动程序验证我们实际上在“主页”页面上。自然,驱动程序被打开到登录页面,所以在主页上查找元素是徒劳的。POM方法应该如何将“PageFactory”主页对象实际“打开”返回到主页?

  • 可以在页面对象模型中处理动态元素吗? 例子: 我想从测试方法中传递输入的name属性值。

  • 我正在使用Selenium为我的网站构建一个测试框架,我实际上希望您在使用页面对象模型时对良好实践的想法:让我们说,我有一个欢迎页面,其中包含一个注销按钮存在的标题,这个标题可以在大多数页面中看到在我的页面中,我认为最好为标题写一个单独的类,比如: 公共类欢迎页 我的问题是,你认为在欢迎页面中包含标题作为属性更好还是应该将它们分开? 让我们以注销测试方法的代码为例: 案例一: 案例2: 第二个问题

  • 是否有任何Gem(比如siteprism:用于Web自动化测试)可以在我的移动自动化测试项目中使用,以使用页面对象模型模式定义屏幕。 提前谢谢