Выполнение Selenium test automation больше не является роскошью в гибкой разработке, поскольку с увеличением количества тестируемых функций нагрузка на тестировщиков продолжает накапливаться. Чтобы не отставать от этого темпа, тестировщикам необходимо автоматизировать свои тесты. Но даже при автоматизации тестов плохая реализация может привести к напрасной трате или увеличению усилий.
Плохая реализация может произойти в тех случаях, например, когда пользовательский интерфейс вашего веб-приложения постоянно меняется, и вы изо всех сил пытаетесь не отставать от них при написании сценариев автоматизации тестирования Selenium. Например, если бы у вас были разные сценарии, использующие один и тот же веб-элемент, всякий раз, когда в элементе происходит изменение, вам пришлось бы вносить изменения в каждый сценарий. Это не только утомительно и отнимает много времени, но и отнимает полосу пропускания, которую команда могла бы использовать в другом месте.
В этом руководстве по Selenium Java я объясню, как объектная модель страницы (POM) может помочь в улучшении обслуживания скриптов для постоянно растущих изменений пользовательского интерфейса для автоматизации тестирования Selenium в Java.
Что такое Объектная модель страницы?
Объектная модель страницы – это шаблон проектирования объектов в Selenium test automation, используемый для создания хранилища элементов веб-интерфейса. POM улучшает читаемость теста и уменьшает дублирование кода, выступая в качестве интерфейса для тестируемой страницы. В объектной модели страницы все веб-страницы имеют отдельные классы страниц. Эти классы страниц находят веб-элементы на странице и содержат все соответствующие методы страницы.
clickLoginButton(); enterCredentials(user_name,user_password); checkIfImageIsDisplayed();
Итак, при выполнении автоматизации тестирования Selenium тестовый пример использует объект этого класса страницы для вызова различных методов для выполнения действий на веб-странице. Поскольку все веб-элементы, связанные со страницей, присутствуют в общем расположении, становится легко реализовать процедуры тестирования Selenium Java и обновлять их при необходимости.
Зачем Нам Нужна Объектная Модель Страницы Для Тестирования Selenium Java?
Из этого руководства по Selenium Java мы теперь знаем, что по мере изменения пользовательского интерфейса вашей веб-страницы возникает необходимость в изменении ваших сценариев автоматизации тестирования Selenium. Но, реализуя объектную модель страницы для тестирования Selenium Java, вам нужно только изменить объекты страницы, так как все изменения, необходимые для тестов, находятся в одном месте.
Это делает проект более надежным, поскольку вам не нужно обновлять свои тесты при каких-либо изменениях в пользовательском интерфейсе. Теперь при одном изменении локатора разработчику не придется просматривать код, чтобы исправить это.
Давайте рассмотрим сценарий тестирования Selenium automation, в котором мы ищем почтовый индекс “12345” среди полного списка на веб-странице, затем нажимаем на него, чтобы найти город и сопоставить его с названием города “MyCityName”.
ListzipCodes = driver.findElements(By.id("zipCodes")); for (WebElement zipCode : zipCodes) { if (zipCode.getText().equals("12345")){ zipCode.click(); break; } } WebElement city = driver.findElement(By.id("city")); assertEquals("MyCityName", city.getText());
Даже при простом тестировании изменения в пользовательский интерфейс вносятся часто. Это может быть новый дизайн или реструктуризация полей и кнопок. Это влияет на тестовый пример, поскольку у вас будет набор тестов Selenium Java, который нуждается в обновлении.
Некоторые из проблем, связанных с этим типом теста Selenium Java, заключаются в следующем:
- Изменения в пользовательском интерфейсе прерывают несколько тестов часто в нескольких местах
- Дублирование селекторов как внутри, так и между тестами – без повторного использования
Каковы преимущества объектной модели страницы (POM)?
Используя объектную модель страницы для тестирования Selenium Java, мы можем предотвратить хрупкость тестового кода и уменьшить вероятность дублирования кода. Это также улучшает читаемость и делает код более интерактивным и понятным.
POM вводит разделяющий уровень, разделяя абстракцию тестового объекта и сценарии тестирования Selenium Java. Это реализуется путем создания объекта пользовательского интерфейса, который будет автоматизирован для переноса элементов HTML и инкапсуляции взаимодействий с пользовательским интерфейсом, который, в свою очередь, принимает все вызовы WebDriver. Таким образом, в случае каких-либо изменений элемента это единственная страница/класс, которая будет обновлена для включения новейшего пользовательского интерфейса.
Объектная модель страницы помогает давать более реалистичные имена функциям, что помогает сопоставить выполняемую операцию. Этот шаблон проектирования можно использовать с любым типом фреймворка, таким как управляемый ключевыми словами, управляемый данными, гибридный фреймворк и т.д.
Как Реализовать Объектную Модель Страницы?
Этот учебник по Selenium Java продемонстрирует, как POM подходит для приложений с несколькими страницами. В структуре объектной модели страницы все веб-элементы, присутствующие на каждой странице, разделены в одном файле класса страницы вместе с функциями для выполнения всех возможных взаимодействий на этой странице и обычно известны как *Page.java как LoginPage.java . Ниже приведены важные темы, которые вам необходимо знать, прежде чем мы начнем писать наш первый сценарий тестирования Selenium Java:
Фабрика страниц
Чтобы использовать POM и эффективно поддерживать его в проекте, мы используем Page Factory, который гласит: создайте все локаторы элементов для страницы в начале класса и инициализируйте все элементы на странице при загрузке страницы и создайте объект самой страницы, прежде чем можно будет использовать переменные веб-элемента.
Элементы веб-страницы могут быть объявлены как
@FindBy(how=How.XPATH, using="fld_username2") WebElement usernameTxtBox2;
И может быть инициализирован с помощью функции initElements в PageFactory как
RegisterPage register = new RegisterPage(); PageFactory.initElements(driver, register);
Или в более простом коде, как
RegisterPage register = PageFactory.initElements(driver, RegisterPage.class);
Или даже в конструкторе класса как
public RegisterPage (WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); }
Понимание локаторов веб-элементов
Фабрика страниц использует ссылку на фактические элементы на странице для инициализации ссылающегося веб-элемента в файле класса страницы с помощью локаторов. Эти локаторы идентифицируются с помощью аннотации @findBy. С помощью этой аннотации пользователь определяет способ поиска элемента, например, по имени, а также необходимую информацию, связанную с элементом, в соответствии с заданным локатором.
@FindBy(how=How.XPATH, using="fld_username2") WebElement usernameTxtBox2;
Каждый раз, когда вызывается функция для любого взаимодействия на веб-странице, которая использует эту переменную webelement, драйвер сначала попытается снова найти элемент с помощью PageFactory. Это очень полезно в случае, если какой-то элемент может быть невидим в начале страницы, но после некоторого действия, тогда также этот элемент доступен для действий, поскольку Page Factory снова ищет элемент, когда он вызывается для какого-либо действия. Для элементов, которые загружаются изначально во время загрузки страницы и не изменяются и могут быть доступны через кэш, Page Factory предоставляет другую аннотацию @CacheLookup для элементов, которые уже есть и которые не нужно искать снова, экономя время и память, и действие может быть выполнено непосредственно над ними.
@FindBy(how=How.XPATH, using="fld_username2") @CacheLookup WebElement usernameTxtBox2;
Все это определение переменной WebElement может быть заменено на
@FindBy(xpath = "fld_username2") private WebElement usernameTxtBox2;
Аннотация @findBy поддерживает ряд стратегий поиска, что упрощает ее использование в соответствии с доступной информацией о веб-элементах. Давайте разберемся во всем этом, чтобы улучшить структуру проекта.
1. Идентификатор
Идентификаторы идентификаторов используются для определения местоположения уникальных элементов в DOM. Идентификаторы идентификаторов уникальны для webelement и являются самым быстрым способом определения местоположения любого веб-элемента.
driver.findElement(By.id("your_text"));
2. Имя
Локаторы имен в тестировании Selenium Java используются для идентификации веб-элементов страницы, в отличие от локаторов идентификаторов, они могут быть не уникальными для страницы.
Name locators in Selenium Java testing are used to identify webelements of a page, unlike ID locators they may not be unique to a page.
3. Класс
Локаторы имен классов в тестировании Selenium Java используются для идентификации веб-элементов с помощью атрибутов класса.
driver.findElement(By.className("inputtext"));
Примечание: Если несколько элементов имеют один и тот же идентификатор/имя/класс, то он всегда действует при первом появлении элемента поиска. В таких случаях нам нужно сделать локатор уникальным или использовать какой-либо другой локатор, который имеет уникальное вхождение для требуемого элемента.
4. Ссылка
Селекторы ссылок можно использовать только для гиперссылок. Возьмите текст ссылки со страницы html.
driver.findElement(By.linkText("Blog"));
5. CSS
Селекторы CSS также можно использовать, когда трудно получить доступ к идентификатору или имени. Имя тега и атрибуты используются для создания локатора элементов css
Текст между начальным и конечным тегами называется innerText.
Случай 1: тег с идентификатором вход
driver.findElement(By.cssSelector("input# ch_login_email "))
Случай 2: тег с классом вход //каждый пробел в имени класса заменяется точкой(.)
driver.findElement(By.cssSelector("form-control mt-3 form-control-lg"))
6. Xpath
Xpath в тестировании Selenium Java используется для идентификации веб-элементов на веб-странице с помощью XML-выражений.
ГРУППА-1
вход
xpath с одним атрибутом//необходимо использовать @ перед именем атрибута, а значение атрибута должно быть заключено в одинарные кавычки
xpath= //input[@placeholder='Search']
xpath с несколькими атрибутами
xpath= //input[@placeholder='Search' or @name='firstname'] //works as logical OR xpath= //input[@placeholder='Search' and @name='firstname'] //works as logical AND
Используйте * вместо атрибута
xpath= //input[@*='Search']
Используйте * вместо имени тега
xpath= //*[@placeholder='Search' or @name='firstname']
ГРУППА-2
Любой Текст
xpath с внутренним текстом
xpath= //a[text()='any text']
xpath с внутренним текстом (содержит)
xpath= //a[contains(text(),'any')]
xpath с внутренним текстом (не содержит)
xpath= //a[not(contains(text(),'any text'))]
xpath с внутренним текстом (начинается с)
xpath= //a[starts-with(text(),'any')]
ГРУППА-3
Несколько путей xpath для одного и того же элемента
xpath= //input[@id='email'] | //input[@id='emailNew']
Динамический xpath, использующий содержит
xpath= //input[contains(@id,'ema')]
Мы подробно рассказали о XPath и подгруппах в нашем Selenium Xpath tutorial .
Написание Нашего Первого тестового Примера Selenium Java с использованием Объектной Модели Страницы
Прежде чем мы начнем писать тестовый пример Selenium Automation, мы должны запомнить несколько невысказанных правил работы с объектной моделью страницы при тестировании Selenium Java, чтобы сделать его более эффективным
- Объектный файл страницы никогда не должен содержать утверждений или каких-либо связанных с ними функций. Он предназначен только для хранения переменных веб-элементов и их взаимодействий.
- Объект страницы для веб-страницы не обязательно должен содержать все веб-элементы страницы. Должны использоваться только значимые и обязательные элементы.
- Почти во всех сценариях взаимодействие с веб-страницей перенаправляет/ведет на новую страницу. Таким образом, страница должна возвращать объект страницы следующей страницы во всех допустимых случаях.
Чтобы написать первый тестовый пример Selenium Automation, давайте возьмем пример потока входа в Gmail для удобства понимания.
Для нашего руководства по Selenium Java этот тестовый пример будет иметь
- Страницы – GmailHomePage.java и GmailLoginPage.java и GmailInboxPage.java
- TestBase.java
- GmailLoginTestCase.java
Базовый класс теста
В этом классе мы создаем объект класса WebDriver и перенаправляем на URL-адрес входа в gmail
public class TestBase { public static WebDriver driver; @BeforeSuite public void initializeWebDriver() throws IOException { System.setProperty("webdriver.chrome.driver","\src\drivers\chromedriver.exe"); driver = new ChromeDriver(); // To maximize browser driver.manage().window().maximize(); // Implicit wait driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); // To open Gmail site driver.get("https:// www.gmail.com"); } @AfterSuite public void quitDriver() { driver.quit(); } }
Класс домашней страницы Gmail
В этом мы определяем веб-элементы домашней страницы Gmail и методы взаимодействия с веб-элементами на ней.
public class GmailHomePage { WebDriver driver; @FindBy(link = "Sign In") WebElement signInButton; public GmailHomePage (WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); } // This method is to click on signIn button public GmailLoginPage clickSignInButton() { signInButton.click(); return new GmailLoginPage(driver); } }
Класс страницы входа в Gmail
В этом мы определяем веб-элементы Страницы входа в Gmail и методы взаимодействия с веб-элементами на ней.
public class GmailLoginPage { WebDriver driver; @FindBy(xpath = "// input[@type='email']]") WebElement emailTextBox; @FindBy(xpath = "// input[@type='password']") WebElement passwordTextBox; @FindBy(xpath = "// div[@role = 'button' and @id = 'identifierNext']") WebElement nextButton; public GmailLoginPage(WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); } // This method is to set Email in the email text box public void setEmail(String strEmail) { emailTextBox.sendKeys(strEmail); } // This method is to set Password in the password text box public void setPassword(String strPassword) { passwordTextBox.sendKeys(strPassword); } // This method is to click on Next Button public GmailInboxPage clickOnNextButton() { nextButton.click(); return new GmailInboxPage (driver); } }
Класс страницы входящих сообщений Gmail
В этом мы определяем веб-элементы домашней страницы Gmail и методы взаимодействия с веб-элементами на ней.
public class GmailInboxPage { WebDriver driver; @FindBy(xpath = "//a[@title='Gmail']") WebElement gmailHeader; public GmailInboxPage (WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); } // This method is to verify if gmail header is visible public Boolean gmailHeaderVisibility() { return gmailHeader.isVisible(); } }
Тестовый класс входа в Gmail
В этом классе мы определяем тестовый пример и последовательность взаимодействий с веб-страницей
public class GmailLoginTest extends TestBase { @Test public void init() throws Exception { GmailHomePage gmailHomePage = new GmailHomePage(driver); GmailLoginPage gmailLoginpage = gmailHomePage.clickSignInButton(); gmailLoginpage.setEmail("abc@gmail.com"); gmailLoginpage.clickOnNextButton(); gmailLoginpage.setPassword("23456@qwe"); GmailInboxPage gmailInboxPage= gmailLoginpage.clickOnNextButton(); Assert.assertTrue(gmailInboxPage.gmailHeaderVisibility); } }
Случай может быть выполнен с помощью любого тестового запуска для кода в соответствии с используемой библиотекой.
Это сделало бы первый тестовый пример с использованием тестирования POM и Selenium Java, где мы переходим на страницу входа в gmail, выполняем вход в систему и проверяем перенаправление на почтовый ящик. Лучшим подходом было бы добавить еще один файл класса, GmailLoginFlow.java чтобы добавить взаимодействия со страницей и абстрагировать их от основного тестового класса, выполните следующие действия:
Обновленный тестовый класс входа в Gmail
@Test public void testGmailLoginFlow() throws Exception { GmailLoginFlow gmailLoginFlow = new GmailLoginFlow(); gmailLoginFlow.verifyGmailLoginFlow(driver); } }
Класс потока входа в Gmail
public class GmailLoginFlow { public GmailLoginFlow() {} public void verifyGmailLoginFlow(WebDriver driver){ GmailHomePage gmailHomePage = new GmailHomePage(driver); GmailLoginPage gmailLoginpage = gmailHomePage.clickSignInButton(); gmailLoginpage.setEmail("abc@gmail.com"); gmailLoginpage.clickOnNextButton(); gmailLoginpage.setPassword("23456@qwe"); GmailInboxPage gmailInboxPage= gmailLoginpage.clickOnNextButton(); Assert.assertTrue(gmailInboxPage.gmailHeaderVisibility); } }
Как выполнить Объектную модель страницы С помощью Лямбда-теста Selenium Grid
Чтобы выполнить тот же сценарий тестирования Selenium Automation поверх лямбда-теста, базовый класс Test можно изменить следующим образом, чтобы включить свойства LambdaTest.
public class TestBase { public static WebDriver driver; @BeforeSuite public void initializeWebDriver() throws IOException { DesiredCapabilities capabilities = new DesiredCapabilities(); String username = ""; String accesskey = " "; String lambdaTestGridURL = "@hub.lambdatest.com/wd/hub"; capabilities.setCapability("build", "Selenium_POM_Project"); capabilities.setCapability("name", "Verify Gmail Login Flowt"); capabilities.setCapability("platform", "Windows 10"); capabilities.setCapability("browserName", "chrome"); capabilities.setCapability("version", "73.0"); capabilities.setCapability("visual",false); capabilities.setCapability("network",false); capabilities.setCapability("console",false); capabilities.setCapability("tunnel",false); try { driver = new RemoteWebDriver(new URL("http://" + username + ":" + accesskey + lambdaTestGridURL), capabilities); } catch (MalformedURLException e) { System.out.println("Invalid grid URL"); } // To maximize browser driver.manage().window().maximize(); // To open Gmail site driver.get("https:// www.gmail.com"); } @AfterSuite public void quitDriver() { driver.quit(); } }
Мониторинг Результатов Тестирования С Помощью Панели Мониторинга Лямбда-Тестов
Когда настройка завершена и мы запустили пробный тест, теперь мы можем перейти к панели мониторинга, чтобы просмотреть результаты выполнения.
Вход в вашу учетную запись Lambda Test перенаправляет пользователей на панель мониторинга, которая дает обзор всех тестов и выполненных действий, а также доступных интеграций.
Вы можете увидеть количество тестов, выполненных с помощью автоматизации, выполненных с помощью утилиты браузера в реальном времени, параллельных сеансов. дата исполнения и многое другое.
Далее идет панель тестирования браузера в реальном времени. Это позволяет пользователям выполнять тесты в любой версии браузера по выбору в любой операционной системе и разрешении по выбору пользователя, просто выбрав из доступного списка.
Визуальное тестирование пользовательского интерфейса позволило пользователям запускать тесты с возможностью создания скриншотов в различных комбинациях ОС и браузеров. Он также предоставляет функции для тестирования различных пользовательских интерфейсов на предмет отзывчивости в зависимости от различных размеров экрана и разрешений.
Раздел автоматизации панели мониторинга помогает пользователям отслеживать все запущенные процессы автоматизации, а также все связанные с ними журналы автоматизации и аналитику.
Журналы автоматизации, предоставляемые Lambda test, могут рассматриваться как лучшая утилита, предоставляемая благодаря широкому спектру различных типов предоставляемых журналов. Журналы в виде видео, сетевого и тестового запуска предоставляют пользователям всю возможную информацию о запуске и в значительной степени облегчают отладку и устранение неполадок.
Журналы для любого запуска, отличного от автоматизации, например, для тестирования в реальном времени, тестирования скриншотов или адаптивного тестирования, можно найти в этом разделе. Это фиксирует всю связанную информацию вместе с фильтрами для лучшего анализа и имеет возможность загружать эти отчеты и скриншоты.
Другим важным примером использования лямбда-теста является то, что он позволяет добавлять проблемы или ошибки одновременно при их обнаружении и предоставляет раздел на той же панели мониторинга для более легкого отслеживания его прогресса на разных этапах.
Кроме того, возможность интеграции с более чем 30 приложениями для различных целей, таких как коммуникация, отслеживание ошибок, CI/CD, управление проектами, добавляет больше положительных сторон к использованию этого инструмента для облачного тестирования.
Завершая Это
Шаблон проектирования хранилища объектов, объектная модель страницы, помогает создать тестовый код, который можно поддерживать, повторно использовать и оптимизировать. В сочетании с Page Factory это упрощает написание веб-страниц для автоматизации selenium, объединяя все взаимодействия с веб-страницами в отдельный файл подкачки. Это делает код простым и легко адаптируемым к постоянно меняющимся требованиям.
В наших предыдущих руководствах по тестированию Selenium Java мы рассмотрели, как протестировать процесс входа в систему, регистрацию пользователя, доступ из.
Итак, на данный момент это все, теперь вы должны иметь возможность создать объектную модель страницы для тестирования Selenium Java. В случае каких-либо сомнений, не стесняйтесь обращаться к нам в разделе комментариев ниже. Если вам понравилась эта статья, поделитесь ею со своими друзьями на facebook, LinkedIn или twitter. Счастливого Тестирования
Оригинал: “https://dev.to/nategrey/selenium-java-testing-page-object-model-2cnh”