Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 页面对象模型页面初始化_C#_Selenium_Design Patterns - Fatal编程技术网

C# 页面对象模型页面初始化

C# 页面对象模型页面初始化,c#,selenium,design-patterns,C#,Selenium,Design Patterns,我使用的是SeleniumExtras.PageObjects,因此为应用程序中的不同页面开发了一个专用类 因此,如果某个测试涉及多个页面,我需要在测试开始时包含3个单独的页面初始化语句: var pageOne = new PageOne(driver); PageFactory.InitElements(driver, pageOne); var pageTwo = new PageTwo(driver); PageFactory.InitElements(driver, pageTwo)

我使用的是
SeleniumExtras.PageObjects
,因此为应用程序中的不同页面开发了一个专用类

因此,如果某个测试涉及多个页面,我需要在测试开始时包含3个单独的页面初始化语句:

var pageOne = new PageOne(driver);
PageFactory.InitElements(driver, pageOne);

var pageTwo = new PageTwo(driver);
PageFactory.InitElements(driver, pageTwo);

var pageTherr = new PageThree(driver);
PageFactory.InitElements(driver, pageThree);

Test starts...
这会使代码变得杂乱无章。有没有一种优雅的方法在代码中使用一条语句来调用所有aval页面对象,以便在测试中使用它们


谢谢

您可以将其添加到基本页对象中

public abstract class AbstractPage
{
    public AbstractPage(IWebDriver driver)
    {
        PageFactory.InitElements(driver, this);          
    }
}

public class PageOne : AbstractPage
{
    public PageOne(IWebDriver driver) : base(driver)
    {
    }
}

在使用三个页面对象之前,不应初始化它们。每个页面对象都应该在其构造函数中调用
PageFactory.InitElements(…)
。页面对象上应该有将您转换到下一页并返回下一页的页面对象的方法。修复实际上包括两个部分:

  • 初始化页面对象构造函数中的元素

  • 向返回下一页的页面对象的页面对象添加方法

  • 这第一部分基本上是

    从你的代码中,第1页通向第2页,第2页通向第3页。PageOne类需要一个执行操作并返回PageII实例的方法。由于您提供的名称含糊不清,我将以创建新博客帖子为例:

    public class AddEditBlogPostPageObject
    {
        [FindsBy(How = How.Id, Using = "Title")]
        public IWebElement TitleField { get; set; }
    
        [FindsBy(How = How.Id, Using = "PostDate")]
        public IWebElement DateField { get; set; }
    
        [FindsBy(How = How.Id, Using = "BodyText")]
        public IWebElement BodyTextField { get; set; }
    
        [FindsBy(How = How.XPath, Using = "//button[contains(., 'Save Blog Post')]")]
        public IWebElement SaveButton { get; set; }
    
        private readonly IWebDriver driver;
    
        public AddEditBlogPostPageObject(IWebDriver driver)
        {
            this.driver = driver;
            PageFactory.InitElements(driver, this);
        }
    
        public ViewBlogPostPageObject CreateNewPost(string title, DateTime blogPostDate, string bodyText)
        {
            TitleField.SendKeys(title);
            DateField.SendKeys(blogPostDate.ToShortDateString());
            BodyTextField.SendKeys(bodyText);
            SaveButton.Click();
    
            return new ViewBlogPostPageObject(driver);
        }
    }
    
    使用它:

    var addBlogPostPage = new AddEditBlogPostPageObject(driver);
    
    var viewBlogPostPage = addBlogPostPage.CreateNewPost(
        "How to use Selenium Page Objects",
        DateTime.Today,
        "All about how to use the page object pattern with Selenium.");
    
    // Use viewBlogPostPage to assert something, or navigate to another page
    

    这样,在使用页面对象之前,您不需要初始化所有页面对象。初始化一个页面对象,对其调用一个方法,该方法返回下一个页面对象。这使得重构测试以匹配应用程序流变得更容易,因为您只需要重构页面对象上返回工作流中“下一页”的方法。

    请为代码片段添加一些上下文,以方便将来的读者。
    var addBlogPostPage = new AddEditBlogPostPageObject(driver);
    
    var viewBlogPostPage = addBlogPostPage.CreateNewPost(
        "How to use Selenium Page Objects",
        DateTime.Today,
        "All about how to use the page object pattern with Selenium.");
    
    // Use viewBlogPostPage to assert something, or navigate to another page