具有静态页面对象模型的 Selenium 自动化
Selenium Automation with static Page Object 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");
}
如果内容(方法、网络元素)在页面对象中是静态的 classes 并且它们暴露给驱动程序的实例 class 它看起来像:
[Test]
public void Test_Login_To_Home_Page()
{
LoginPage.LoginAs(“user”, “password1”);
HomePage.GoTo();
Assert.IsTrue(HomePage.IsAt(), "failed to login successfully");
}
我看不出通过创建页面对象的实例可以获得什么 classes。后一种方法看起来更干净,它从测试中消除了很多噪音,并且更容易培训缺乏编程技能的没有经验的自动化测试人员。
使用后一种方法有什么固有的缺点吗?我想不出任何但似乎无处可推广这种方法,他们似乎都使用前一种方法。有什么缺点吗?
如何调用驱动程序在页面对象中查找元素的示例:
using static SeleniumWebDriver;
public class housesPage
{
private static IWebElement houses_SelectMenu => Instance.FindElement(By.Id("housesSelect"));
并且在 SeleniumWebDriver class:
public static class SeleniumWebDriver
{
public static IWebDriver Instance { get; set; }
public static IWebDriver CreateWebDriver()
{
Instance = CreateChromeDriver();
return Instance;
我看到一个很大的缺点 - 你不能 运行 你的测试并行。如果您有一个静态驱动程序,这意味着您一次只能执行一个测试。测试规则之一是测试不应依赖于任何其他测试。会被违反的。
那么有哪些选择呢?我更喜欢链接这些方法,以使其更流畅。
假设登录页面如下所示:
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 框架,它们通常显示:
[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");
}
如果内容(方法、网络元素)在页面对象中是静态的 classes 并且它们暴露给驱动程序的实例 class 它看起来像:
[Test]
public void Test_Login_To_Home_Page()
{
LoginPage.LoginAs(“user”, “password1”);
HomePage.GoTo();
Assert.IsTrue(HomePage.IsAt(), "failed to login successfully");
}
我看不出通过创建页面对象的实例可以获得什么 classes。后一种方法看起来更干净,它从测试中消除了很多噪音,并且更容易培训缺乏编程技能的没有经验的自动化测试人员。
使用后一种方法有什么固有的缺点吗?我想不出任何但似乎无处可推广这种方法,他们似乎都使用前一种方法。有什么缺点吗?
如何调用驱动程序在页面对象中查找元素的示例:
using static SeleniumWebDriver;
public class housesPage
{
private static IWebElement houses_SelectMenu => Instance.FindElement(By.Id("housesSelect"));
并且在 SeleniumWebDriver class:
public static class SeleniumWebDriver
{
public static IWebDriver Instance { get; set; }
public static IWebDriver CreateWebDriver()
{
Instance = CreateChromeDriver();
return Instance;
我看到一个很大的缺点 - 你不能 运行 你的测试并行。如果您有一个静态驱动程序,这意味着您一次只能执行一个测试。测试规则之一是测试不应依赖于任何其他测试。会被违反的。
那么有哪些选择呢?我更喜欢链接这些方法,以使其更流畅。 假设登录页面如下所示:
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();
}