machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Автоматизация тестирования угловых приложений с помощью Selenium Java

Дата публикации Oct 3, 2019

Если вы ищете «рекомендуемый» инструмент для автоматизации ваших приложений Angular / AngularJS, тогда это может быть не место для вас, я уверен, что первая рекомендация в результатах поиска Google будет Protractor или Webdriver.io.

Однако, если вы являетесь человеком с неизбежной любовью к Java, как я, ИЛИ ваш клиент одержим использованием селена Webdriver ИЛИ просто потому, что вы хотите сохранить существующий надежный пакет автоматизации селен, то это место для вас, даже если вы чувствуете, в противном случае свободно оставаться рядом.

Не теряя много времени, позвольте мне начать с того, как я создал надежную среду автоматизации для клиентских веб-приложений, использующих Selen Webdriver Java. Я выбрал модель фабрики страниц, которая является оптимизированной версией объектной модели страницы, вы можете выбрать последнюю. Все, что вам нужно сделать, - это определить страницы, которые вы хотите автоматизировать, создать отдельный класс или модель для конкретной страницы с осмысленным именем, за которым следует идентификация и добавление соответствующих веб-элементов и методов внутри созданного класса.

Страница Заводская модель для страницы входа

Все утверждения должны принадлежать отдельному тестовому классу внутри тестовых методов. Я использую среду TestNG для выполнения утверждений.

Тестовый класс, содержащий утверждения

Позвольте мне рассказать о проблемах, с которыми я столкнулся при автоматизации приложений Angular с использованием Selenium, и о трех подходах, которые я включил в их решение.

A. Использование неявного, явного и свободного ожидания

Из-за асинхронного поведения приложений Angular трудно предсказать время загрузки элементов страницы, поэтому нам нужно будет добавить ожидания с определенными условиями или без них. Хотя это не популярный подход, он работает прилично, когда тщательно разработан и адаптирован. Нам нужно убедиться, что элементы DOM классифицированы на основе идентификаторов или классов, поскольку Selenium поддерживает выборку веб-элементов через локаторы, такие как Id, имя класса, CSS или XPath, через угловые атрибуты или директивы.

Мой подход состоял в том, чтобы создать отдельный класс под названием SeleniumUtils, содержащий различные методы ожидания, как описано ниже, чтобы его можно было вызывать для различных классов.

Неявные ожидания:Неявное ожидание просто говорит веб-драйверу подождать некоторое время, прежде чем провалить тест с «Исключением не найден такой элемент»

private static void setTimeout(int N) {
driver.manage().timeouts().implicitlyWait(seconds, TimeUnit.SECONDS);
}

В вышеупомянутом методе неявное ожидание примет 2 параметра,

  1. Первый принимает время как целочисленное значение и
  2. Второй принимает измерение времени в единицах: секунды, минуты, миллисекунды, микросекунды, наносекунды, дни, часы и т. Д.

Приведенный выше метод сообщает Webdriver, что нужно подождать N секунд, прежде чем выдать исключение.

Явные ожидания:Явное ожидание может использоваться для информирования веб-драйвера о необходимости ожидания определенных условий, также называемыхОжидаемые условия

ИЛИ

ждать максимум времени, прежде чемElementNotVisibleException”Брошен

Явные ожидания могут использоваться при ожидании динамической загрузки элементов Ajax, в отличие от неявных ожиданий. Однако его можно применять только для указанных элементов.

public static void WaitUntilVisible(WebElement element) {
waitForCondition(ExpectedConditions.visibilityOf(element), Config.elementWaitTimeout);
}public static void waitBy(By by) {
WebDriverWait wait = new WebDriverWait(driver, 60);
wait.until(ExpectedConditions.visibilityOfElementLocated(by));
}private static void waitForCondition(ExpectedCondition condition, int timeout) {
WebDriverWait wait = new WebDriverWait(driver, timeout);
wait.until(condition);
}public static WebElement waitForElementToClickable(WebElement element) {
waitForCondition(ExpectedConditions.elementToBeClickable(element), Config.elementWaitTimeout);
return element;
}

Приведенные выше примеры демонстрируют время ожидания, определенное в «WebDriverWaitКласс илиExpectedConditionsВыполнить, что произойдет первым.

public String getRegionLabel() {
SeleniumUtils.WaitUntilVisible(regionLabel);
return this.regionLabel.getText();
}

Приведенный выше фрагмент кода говорит веб-драйверу, что нужно подождать, пока не будет настроено время настройки.elementWaitTimeout (например, 20 секунд)до «ожидаемых условий», в данном случае «visibilityofElementLocated" которые встретились.

Ниже приведены ожидаемые условия, которые можно использовать в явном ожидании с учетом удобства использования.

  1. alertIsPresent ()
  2. elementSelectionStateToBe ()
  3. elementToBeClickable ()
  4. elementToBeSelected ()
  5. frameToBeAvaliableAndSwitchToIt ()
  6. invisibilityOfTheElementLocated ()
  7. invisibilityOfElementWithText ()
  8. presenceOfAllElementsLocatedBy ()
  9. presenceOfElementLocated ()
  10. textToBePresentInElement ()
  11. textToBePresentInElementLocated ()
  12. textToBePresentInElementValue ()
  13. titleIs ()
  14. titleContains ()
  15. visibilityOf ()
  16. visibilityOfAllElements ()
  17. visibilityOfAllElementsLocatedBy ()
  18. visibilityOfElementLocated ()

Свободно ждет:Беглое ожидание может быть использовано, чтобы сказать веб-драйверу ждатьОжидаемые условия, так же хорошо какчастотас помощью которого мы хотим проверить условие до того, как будет сгенерировано исключение «ElementNotVisibleException».

public static WebElement waitForVisibleFluentWait(WebElement element) {
final Wait<WebDriver> wait = getDefaultFluentWait()
.ignoring(NoSuchElementException.class)
.ignoring(ElementNotVisibleException.class);
wait.until(ExpectedConditions.visibilityOf(element));
return element;
}private static FluentWait<WebDriver> getDefaultFluentWait() {
return getCustomFluentWait(DEFAULT_WAIT_TIME, DEFAULT_POLL_TIME);
}private static FluentWait<WebDriver> getCustomFluentWait(int waitTime, int pollTime) {
return new FluentWait<>(driver)
.withTimeout(waitTime, TimeUnit.SECONDS)
.pollingEvery(pollTime, TimeUnit.SECONDS);
}

В приведенном выше примере мы вызываем метод быстрого ожидания с тайм-аутом «время ожидания» в секундах, а частота установлена ​​на «pollTimeСекунд.

Б. Код с использованием JavaScript Executor

Иногда поиск веб-элементов с использованием локаторов, таких как XPath, CSS и т. Д., Может не работать, особенно когда веб-страница отображается асинхронно. Мы можем прибегнуть к JavaScriptExecutor для выполнения желаемой операции над веб-элементом.

Все, что вам нужно сделать, это «импортorg.openqa.selenium JavascriptExecutor »в ваш соответствующий класс, так как Selenium поддерживает использование javascript Executor без каких-либо дополнительных плагинов.

Ниже приведены два метода, предлагаемых javascript Executor:

i) executeAsyncScript: Использование executeAsyncScript повышает производительность ваших тестов Selenium. Этот метод удобен, когда вы не хотите блокировать любые дальнейшие действия, выполняемые браузером Selenium, заставляя пользователей ждать, пока страница полностью не отобразится.

executeAsyncScript предоставит обратный вызов для комплекта тестирования на стороне сервера, как только сценарий завершит выполнение асинхронно. Это просто означает, что все внутри скрипта будет выполняться браузером, а не сервером.

Пример executeAsyncScript:

В этом сценарии мы будем использовать демонстрационный сайт «Facebook» для иллюстрации executeAsyncScript. В этом примере мы будем

Запустите браузер и откройте веб-страницу «https://facebook.com«,

Приложение ждет 5 секунд для выполнения дальнейших действий.

Шаг 1)Захватите время начала до ожидания в течение 5 секунд (5000 миллисекунд) с помощью метода executeAsyncScript ().

Шаг 2)Затем используйте executeAsyncScript (), чтобы подождать 5 секунд.

Шаг 3)Затем получите текущее время.

Шаг 4)Вычтите текущее время из начального времени, которое равно прошедшему времени или результату.

Шаг 5)Убедитесь, что отображаемое значение больше 5000 миллисекунд

import java.util.concurrent.TimeUnit;import org.openqa.selenium.JavascriptExecutor;		
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;

public class AngularTest{@Testpublic void Login(){WebDriver driver= new FirefoxDriver();//Creating the JavascriptExecutor interface object by Type castingJavascriptExecutor js = (JavascriptExecutor)driver;//Launching the Site.driver.get("https://facebook.com/");//Maximize windowdriver.manage().window().maximize();//Set the Script Timeout to 20 secondsdriver.manage().timeouts().setScriptTimeout(20, TimeUnit.SECONDS);//Declare and set the start timelong start_time = System.currentTimeMillis();//Call executeAsyncScript() method to wait for 5 secondsjs.executeAsyncScript("window.setTimeout(arguments[arguments.length - 1], 5000);");//Get the difference (currentTime - startTime) of times.System.out.println("Passed time: " + (System.currentTimeMillis() - start_time));}
}

Выход:Успешно отображается прошедшее время более 5 секунд (5000 миллисекунд)

Passed time: 5022		
PASSED: Login

ii) executeScript:Этот метод выполняет JavaScript в контексте текущего выбранного фрейма или окна в Selenium.

Синтаксис:

JavascriptExecutor js = (JavascriptExecutor) driver;  
js.executeScript(Script,Arguments);
  • Скрипт - это JavaScript, который вы хотите выполнить.
  • Аргументы - поле параметра для отправки аргументов.

Скрипт может возвращать значения. Типы данных возвращаются

  • логический
  • Длинная
  • строка
  • Список
  • WebElement.

В следующих примерах представлены несколько различных способов использования executeScript:

//Click the element
public static void
focusAndClick(WebElement element) {
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", element);
}//Scroll the element into view
public static void scrollAndClick(WebElement element) {
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].scrollIntoView(true);", element);
element.click();
}//Scroll by specific amount
public static Boolean scrollAndFind(WebElement element) {
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("window.scrollBy(0,600);", element);
return element.isDisplayed();
}//Scroll to the respective element
public static void scrollPage() {
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("window.scrollTo(0, document.body.scrollHeight);");
}

С,Использование ngWebDriver

Selenium в основном предоставляет способы идентификации веб-элементов с помощью локаторов, таких как id, name, class, CSS и XPath, однако Angular расширяет HTML и использует атрибуты, называемые директивами, которые помогают создавать динамические локаторы, такие как ng-bind, ng-class, ng -model, ng-options… и т. д., которые не могут быть идентифицированы Selenium Webdriver.

Чтобы преодолеть вышеуказанную проблему, можно использовать библиотеку ngWebDriver, которая специально разработана для автоматизации AngularJS и Angular Web-приложений с использованием Selenium с Java. В этой библиотеке есть все функции Javascript, созданные для проекта Protractor.

Преимущества использования этой библиотеки следующие:

  • Нет необходимости писать дополнительный JavaScript для ожидания угловых запросов
  • Он предоставляет пользователям новые методы для определения угловых специфических атрибутов.
  • Он также предоставляет аннотации FindBy для создания фабрик объектов страниц.

Создание тестов с использованием ngWebDriver

Первым шагом является импорт библиотеки ngWebDriver из maven или присоединение jar-файла ngWebDriver к пути сборки проектов.

<dependency>
<groupId>com.paulhammant</groupId>
<artifactId>ngwebdriver</artifactId>
<version>1.1.3</version>
</dependency>

Maven Dependency XML Code

WebDriver driver = new ChromeDriver();
JavascriptExecutor jsDriver = (JavascriptExecutor) driver;
NgWebDriver ngDriver = new NgWebDriver(jsDriver);

NGWebDriver - это класс, который принимает JavaScriptExecutor в качестве входных данных при инициализации.

@BeforeMethod
public void setUpClass() {
driver.get(TestUrls.url);
ngDriver.waitForAngularRequestsToFinish();
}

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

Создание локаторов с использованием угловых атрибутов

ngWebdriver предоставляет класс ByAngular, который предоставляет необходимые локаторы, такие как:

1) привязка, модель, параметры, повторитель, необходимый для определения местоположения угловых атрибутов, ng-bind, ng-model, ng-options, ng-repeat.

2) Он предоставляет все стратегии локатора транспортира, которые полезны для поиска кнопок с локаторами текста / частичного текста, такими как buttonText иpartalButtonText.

3) Это помогает находить элементы, используя CSS-селекторы, содержащие текст, используя локатор cssContainedText.

driver.findElement(ByAngular.model("logIn")).click();

Создание фабрик объектов страниц с использованием локаторов ngWebDriver

Фабрики или модели объектов страницы можно создавать по той же методике, что и неугловые приложения, просто импортируя угловые локаторы ngWebDriver.

import com.paulhammant.ngwebdriver.ByAngularButtonText;public class LoginPage {
//Contains all the login page elements
private final WebDriver driver;@ByAngularButtonText.FindBy(buttonText = "Logout")
private WebElement logOut;public void logOut() {
dashboardPage.clickProfileIcon();
logOut.click();
}
}

Я считаю, что грамотное использование комбинации всех вариантов, описанных выше, поможет вам получить надежную систему автоматизации селена для вашего углового приложения. Вы можете дополнительно интегрировать свою среду с соусами или любыми другими облачными сервисами, чтобы проводить тесты в нескольких браузерах. Удачного кодирования!

Ссылки:https://www.guru99.com/implicit-explicit-waits-selenium.html

Тестирование угловых приложений с использованием Selenium

HTML отлично подходит для объявления статических документов, но он прерывается, когда мы пытаемся использовать его для объявления динамических представлений в сети…

blog.vsoftconsulting.com

Paul-hammant / ngWebDriver

Кусочки и кусочки AngularJS и WebDriver для Java (порт Protractor) - paul-hammant / ngWebDriver

GitHub ком

JavaScriptExecutor в Selenium WebDriver с примером

JavaScriptExecutor - это интерфейс, который помогает выполнять JavaScript через Selenium Webdriver. JavaScriptExecutor ...

www.guru99.com

https://blog.vsoftconsulting.com/blog/testing-angular-applications-using-selenium

Оригинальная статья

Footer decor

© machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map