Поиск…


Вступление

Значительная роль в автоматизации веб-сайтов и веб-приложений заключается в идентификации элементов на экране и взаимодействии с ними. Элементы находятся в Selenium с помощью локаторов и класса By . Эти локаторы и взаимодействия помещаются внутри объектов страницы как наилучшая практика, чтобы избежать дублирования кода и упростить обслуживание. Он инкапсулирует WebElements и предполагает содержать информацию о поведении и возврате на странице (или часть страницы в веб-приложении).

замечания

Объектная модель страницы - это шаблон, в котором мы пишем объектно-ориентированные классы, которые служат интерфейсом для определенного вида веб-страницы. Мы используем методы этого класса страницы для выполнения требуемого действия. Несколько лет назад мы манипулировали HTML-кодом веб-страницы в тестовых классах, что было очень сложно поддерживать вместе с хрупкими изменениями в пользовательском интерфейсе.

Однако, если ваш код организован таким образом, что шаблон объекта страницы предоставляет API-интерфейс, специфичный для приложения, позволяющий вам манипулировать элементами страницы без копания вокруг HTML. Основная ручка большого пальца говорит, что ваш объект страницы должен иметь все, что человек может сделать на этой веб-странице. Например, чтобы получить доступ к текстовому полю на веб-странице, вы должны использовать метод для получения текста и строки возврата после выполнения всех изменений.

Несколько важных моментов, которые вы должны учитывать при разработке объектов страницы:

  1. Объект страницы обычно не должен строиться только для страниц, но вы должны предпочесть строить его для значительных элементов страницы. Например, страница с несколькими вкладками для отображения разных диаграмм ваших академиков должна иметь одинаковое количество страниц, чем количество вкладок.

  2. Переход с одного вида на другой должен возвращать экземпляр классов страниц.

  3. Методы утилиты, которые должны быть доступны только для определенного вида или веб-страницы, должны принадлежать только этому классу.

  4. Методы утверждения не должны заботиться о классах страниц, вы можете иметь методы для возврата к логическим, но не проверяйте их там. Например, чтобы проверить полное имя пользователя, вы можете получить метод для получения логического значения:

     public boolean hasDisplayedUserFullName (String userFullName) {
         return driver.findElement(By.xpath("xpathExpressionUsingFullName")).isDisplayed();
     }
    
  5. Если ваша веб-страница основана на iframe, предпочитайте также классы страниц для iframes.

Преимущества шаблона объекта страницы:

  1. Чистое разделение между тестовым кодом и кодом страницы
  2. В случае каких-либо изменений в пользовательском интерфейсе веб-страницы не нужно менять код в нескольких местах. Измените только классы страниц.
  3. Нет разбросанных локаторов элементов.
  4. Делает код более понятным
  5. Простое обслуживание

Введение (использование Java)

Пример выполнения теста входа на основе шаблона объекта страницы:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

/**
 * Class which models the view of Sign-In page
 */
public class SignInPage {
    
    @FindBy(id="username")
    private usernameInput;

    @FindBy(id="password")
    private passwordInput;

    @FindBy(id="signin")
    private signInButton;

    private WebDriver driver;

    public SignInPage(WebDriver driver) {
        this.driver = driver;
    }
    
    /**
     * Method to perform login
     */
    public HomePage performLogin(String username, String password) {
        usernameInput.sendKeys(username);
        passwordInput.sendKeys(password);
        signInButton.click();
        return PageFactory.initElements(driver, HomePage.class);
    }
}


import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
/**
 * Class which models the view of home page
 */
public class HomePage {
    @FindBy(id="logout")
    private logoutLink;

    private WebDriver driver;

    public HomePage(WebDriver driver) {
        this.driver = driver;
    }
    
    /**
     * Method to log out
     */
    public SignInPage logout() {
        logoutLink.click();
        wait.ForPageToLoad();
        return PageFactory.initElements(driver, SignInPage.class);
    }
}

/**
 * Login test class
 */
public class LoginTest {
    public void testLogin() {
        SignInPage signInPage = new SignInPage(driver);
        HomePage homePage = signInPage.login(username, password);
        signInPage = homePage.logout();
    }
}

C #

Объекты страницы должны содержать поведение, возвращаемую информацию для утверждений и, возможно, метод для состояния готовности страницы при инициализации. Selenium поддерживает объекты страницы с помощью аннотаций. В C # это выглядит следующим образом:

using OpenQA.Selenium;
using OpenQA.Selenium.Support.PageObjects;
using OpenQA.Selenium.Support.UI;
using System;
using System.Collections.Generic;

public class WikipediaHomePage
{
    private IWebDriver driver;
    private int timeout = 10;
    private By pageLoadedElement = By.ClassName("central-featured-logo");

    [FindsBy(How = How.Id, Using = "searchInput")]
    [CacheLookup]
    private IWebElement searchInput;

    [FindsBy(How = How.CssSelector, Using = ".pure-button.pure-button-primary-progressive")]
    [CacheLookup]
    private IWebElement searchButton;

    public ResultsPage Search(string query) 
    {
        searchInput.SendKeys(query);
        searchButton.Click();
    }

    public WikipediaHomePage VerifyPageLoaded() 
    {
        new WebDriverWait(driver, TimeSpan.FromSeconds(timeout)).Until<bool>((drv) =>  return drv.ExpectedConditions.ElementExists(pageLoadedElement));

        return this;
    }
}

заметки:

  • CacheLookup сохраняет элемент в кеше и сохраняет возврат нового элемента к каждому вызову. Это повышает производительность, но не подходит для динамически изменяющихся элементов.
  • searchButton имеет 2 имени класса и идентификатор, поэтому я не могу использовать имя класса или идентификатор.
  • Я подтвердил, что мои локаторы возвратят мне элемент, который я хочу использовать Инструменты разработчика (для Chrome), в других браузерах вы можете использовать FireBug или аналогичный.
  • Метод Search() возвращает другой объект страницы ( ResultsPage ), поскольку поисковый щелчок перенаправляет вас на другую страницу.

Объектная модель страницы оптимальной практики

  • Создавайте отдельные файлы для верхнего и нижнего колонтитула (поскольку они распространены для всех страниц, и нет смысла делать их частью одной страницы)
  • Сохраняйте общие элементы (например, Поиск / Назад / Далее и т. Д.) В отдельном файле (Идея состоит в том, чтобы удалить любое дублирование и сохранить логику сегрегации)
  • Для драйвера рекомендуется создать отдельный класс драйвера и сохранить драйвер как статический, чтобы он мог быть доступен на всех страницах! (У меня есть все мои веб-страницы, расширяющие DriverClass)
  • Функции, используемые в PageObjects, разбиты на наименьший возможный фрагмент, учитывая частоту и способ их вызова (способ, которым вы это сделали для входа в систему, хотя логин может быть разбит на enterUsername и enterPassword, но все еще сохраняет его поскольку функция входа более логична, поскольку в большинстве случаев функция Login будет вызываться вместо отдельных вызовов для enterUsername и enterPassword)
  • Использование самого PageObjects отделяет тестовый скрипт от elementLocators
  • Утилиты функции в отдельной папке utils (например, DateUtil, excelUtils и т. Д.)
  • У вас есть конфигурации в отдельной папке conf (например, настройка среды, на которой должны выполняться тесты, настройка выходных и входных папок)
  • Включить screenCapture при сбое
  • Имейте переменную статического ожидания в DriverClass с некоторым неявным временем ожидания, как вы это делали. Всегда старайтесь иметь условные ожидания, а не статические ожидания: wait.until (ExpectedConditions). Это гарантирует, что ожидание не замедляет выполнение без необходимости.


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow