用于在 Selenium+specflow 框架中链接页面对象的 C# 泛型
C# generics for linking page objects in Selenium+specflow framework
我正在尝试使用 Specflow 和 Selenium 创建 POM。
我正在学习一门课程,他使用 C# 泛型来调用页面。
谁能帮助我理解以下代码的工作原理:
class BasePage
{
public T As<T>()where T: BasePage
{
return(T) this;
}
}
public class PropertiesCollection
{
private static BasePage _currentPage;
public static BasePage currentPage
{
get{return _currentPage;}
set{
ScenarioContext.current["class"]=value;
_currentPage=ScenarioContext.Current.Get<BasePage>("class");
}
}
}
步骤定义文件中的代码:(代码编写如下,而不是为每个页面创建一个对象并从中调用方法)
[Then(@"I should be asked to enter Username and password")]
public void ThenIShouldBeAskedToEnterUsernameAndPassword()
{
PropertiesCollection.currentPage.As<LoginPage>().Login(username,password);
}
PropertiesCollection(代码行上方)无法读取 LoginPage,直到我在步骤之前创建对象 (PropertiesCollection.currentPage = new LoginPage();)。
而且它没有阅读下一页
[Then(@"I should Login and see Welcome page")]
public void ThenIShouldLoginAndSeeWelcomePage()
{
PropertiesCollection.currentPage.As<WelcomePage>().WelcomeLabel();
}
它抛出错误:无法将登录页面转换为欢迎页面。
当我调试并检查它的(currentPage) 仍在登录页面中时
我将对场景进行假设:
Scenario: Logging in
When I log
Then should be logged in and see the welcome page
此处的关键是正确设置您的页面对象模型。导致新页面加载的方法应该 return 下一页的页面模型。登录时,LoginPage.Login(...) 方法应该 return WelcomePage 的一个实例。您的 SpecFlow 步骤应该调用这些页面模型方法,并在您希望用户导航到新页面时重新分配 currentPage
属性。
修改登录页面的方法如下class:
public class LoginPage
{
private readonly IWebDriver driver;
public LoginPage(IWebDriver driver)
{
this.driver = driver;
}
///
/// <summary>
/// Logs in and redirects to the welcome screen
/// </summary>
/// <param name="username"></param>
/// <param name="password"></param>
/// <returns>A page object model representing the welcome screen</returns>
public WelcomePage Login(string username, string password)
{
// log in
return new WelcomePage(driver);
}
}
请注意 Login() 方法不只是在表单字段中键入用户名和密码,然后单击“登录”按钮。它 return 是您希望用户在成功登录后导航到的页面对象的实例。
设置 currentPage
属性:
的一些示例步骤定义
[When(@"I log in")]
public void WhenILogIn()
{
// Initialize a new login page object
var loginPage = new LoginPage(driver);
// Log the user in, and assign reference to the next expected page
// to a local variable.
var welcomePage = loginPage.Login(username, password);
// Set the "current page" the user should be on
PropertiesCollection.currentPage = welcomePage;
}
[Then(@"should be logged in and see welcome page")]
public void ThenShouldBeLoggedInAndSeeWelcomePage()
{
// Get the "current page" and cast it to the expected type:
var welcomePage = PropertiesCollection.currentPage.As<WelcomePage>();
// Make your assertion:
Assert.AreEqual("Welcome!", welcomePage.WelcomeLabel());
}
我正在尝试使用 Specflow 和 Selenium 创建 POM。 我正在学习一门课程,他使用 C# 泛型来调用页面。 谁能帮助我理解以下代码的工作原理:
class BasePage
{
public T As<T>()where T: BasePage
{
return(T) this;
}
}
public class PropertiesCollection
{
private static BasePage _currentPage;
public static BasePage currentPage
{
get{return _currentPage;}
set{
ScenarioContext.current["class"]=value;
_currentPage=ScenarioContext.Current.Get<BasePage>("class");
}
}
}
步骤定义文件中的代码:(代码编写如下,而不是为每个页面创建一个对象并从中调用方法)
[Then(@"I should be asked to enter Username and password")]
public void ThenIShouldBeAskedToEnterUsernameAndPassword()
{
PropertiesCollection.currentPage.As<LoginPage>().Login(username,password);
}
PropertiesCollection(代码行上方)无法读取 LoginPage,直到我在步骤之前创建对象 (PropertiesCollection.currentPage = new LoginPage();)。
而且它没有阅读下一页
[Then(@"I should Login and see Welcome page")]
public void ThenIShouldLoginAndSeeWelcomePage()
{
PropertiesCollection.currentPage.As<WelcomePage>().WelcomeLabel();
}
它抛出错误:无法将登录页面转换为欢迎页面。
当我调试并检查它的(currentPage) 仍在登录页面中时
我将对场景进行假设:
Scenario: Logging in
When I log
Then should be logged in and see the welcome page
此处的关键是正确设置您的页面对象模型。导致新页面加载的方法应该 return 下一页的页面模型。登录时,LoginPage.Login(...) 方法应该 return WelcomePage 的一个实例。您的 SpecFlow 步骤应该调用这些页面模型方法,并在您希望用户导航到新页面时重新分配 currentPage
属性。
修改登录页面的方法如下class:
public class LoginPage
{
private readonly IWebDriver driver;
public LoginPage(IWebDriver driver)
{
this.driver = driver;
}
///
/// <summary>
/// Logs in and redirects to the welcome screen
/// </summary>
/// <param name="username"></param>
/// <param name="password"></param>
/// <returns>A page object model representing the welcome screen</returns>
public WelcomePage Login(string username, string password)
{
// log in
return new WelcomePage(driver);
}
}
请注意 Login() 方法不只是在表单字段中键入用户名和密码,然后单击“登录”按钮。它 return 是您希望用户在成功登录后导航到的页面对象的实例。
设置 currentPage
属性:
[When(@"I log in")]
public void WhenILogIn()
{
// Initialize a new login page object
var loginPage = new LoginPage(driver);
// Log the user in, and assign reference to the next expected page
// to a local variable.
var welcomePage = loginPage.Login(username, password);
// Set the "current page" the user should be on
PropertiesCollection.currentPage = welcomePage;
}
[Then(@"should be logged in and see welcome page")]
public void ThenShouldBeLoggedInAndSeeWelcomePage()
{
// Get the "current page" and cast it to the expected type:
var welcomePage = PropertiesCollection.currentPage.As<WelcomePage>();
// Make your assertion:
Assert.AreEqual("Welcome!", welcomePage.WelcomeLabel());
}