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(…)
。页面对象上应该有将您转换到下一页并返回下一页的页面对象的方法。修复实际上包括两个部分:
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