用于在 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());
}