Вы не должны инициализировать три объекта страницы перед их использованием.Каждый объект страницы должен вызывать PageFactory.InitElements(...)
внутри своего конструктора.Ваши объекты страницы должны иметь методы, которые переходят вас на следующую страницу и возвращают объект страницы для следующей страницы.Исправление состоит из двух частей:
Инициализация элементов в конструкторах объектов страницы
Добавление методов к объектам страницы, которые возвращают объект страницы следующей страницы.
Эта первая часть в основном уже ответила на этот вопрос .
public class PageOne
{
public PageOne(IWebDriver driver)
{
PageFactory.InitElements(driver, this);
}
}
public class PageTwo
{
public PageTwo(IWebDriver driver)
{
PageFactory.InitElements(driver, this);
}
}
public class PageThree
{
public PageThree(IWebDriver driver)
{
PageFactory.InitElements(driver, this);
}
}
Из вашего кода страница 1 ведет на страницу 2,что приводит к странице 3. Класс PageOne нуждается в методе, который выполняет действие и возвращает экземпляр PageTwo.Поскольку приведенные вами имена являются расплывчатыми, в качестве примера я буду использовать создание нового блога:
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
Таким образом, вам не нужноинициализировать все объекты страницы перед их использованием.Вы инициализируете один объект страницы, вызываете для него метод, который возвращает объект следующей страницы.Это упрощает рефакторинг ваших тестов для соответствия потоку приложения, поскольку вам нужно только рефакторизовать методы объектов вашей страницы, которые возвращают «следующую страницу» в рабочем процессе.