Инициализация страницы объектной модели страницы - PullRequest
1 голос
/ 04 апреля 2019

Я использую 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, поэтому они используются втест?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Вы не должны инициализировать три объекта страницы перед их использованием.Каждый объект страницы должен вызывать PageFactory.InitElements(...) внутри своего конструктора.Ваши объекты страницы должны иметь методы, которые переходят вас на следующую страницу и возвращают объект страницы для следующей страницы.Исправление состоит из двух частей:

  1. Инициализация элементов в конструкторах объектов страницы

  2. Добавление методов к объектам страницы, которые возвращают объект страницы следующей страницы.

Эта первая часть в основном уже ответила на этот вопрос .

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

Таким образом, вам не нужноинициализировать все объекты страницы перед их использованием.Вы инициализируете один объект страницы, вызываете для него метод, который возвращает объект следующей страницы.Это упрощает рефакторинг ваших тестов для соответствия потоку приложения, поскольку вам нужно только рефакторизовать методы объектов вашей страницы, которые возвращают «следующую страницу» в рабочем процессе.

0 голосов
/ 04 апреля 2019

Вы можете добавить его в объект базовой страницы

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

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