1. Введение
В этом коротком руководстве мы рассмотрим простой пример того, как щелкнуть и добавить элемент в Selenium WebDriver с помощью JavaScript.
В нашей демонстрации мы будем использовать JUnit и Selenium , чтобы открыть https://foreach.com
и выполнить поиск статей «Selenium».
2. Зависимости
Во- первых, мы добавляем зависимости selenium-java
и junit
в наш проект в pom.xml
:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
3. Конфигурация
Далее нам нужно настроить WebDriver. В этом примере мы будем использовать его реализацию Chrome после загрузки его последней версии :
@Before
public void setUp() {
System.setProperty("webdriver.chrome.driver", new File("src/main/resources/chromedriver.mac").getAbsolutePath());
driver = new ChromeDriver();
}
Мы используем метод, аннотированный @Before
, для первоначальной настройки перед каждым тестом. Внутри мы устанавливаем свойство webdriver.chrome.driver,
определяющее местоположение драйвера Chrome . После этого мы создаем экземпляр объекта WebDriver .
Когда тест завершится, мы должны закрыть окно браузера. Мы можем сделать это, поместив оператор driver.close()
в метод, аннотированный @After
. Это гарантирует, что он будет выполнен, даже если тест не пройден:
@After
public void cleanUp() {
driver.close();
}
4. Открытие браузера
Теперь мы можем создать тестовый пример , который выполнит наш первый шаг — откроет веб-сайт:
@Test
public void whenSearchForSeleniumArticles_thenReturnNotEmptyResults() {
driver.get("https://foreach.com");
String title = driver.getTitle();
assertEquals("ForEach | Java, Spring and Web Development tutorials", title);
}
Здесь мы используем метод driver.get()
для загрузки веб-страницы. Затем мы проверяем его заголовок, чтобы убедиться, что мы находимся в правильном месте.
5. Щелчок по элементу с помощью JavaScript
Selenium поставляется с удобным методом WebElement#click
, который вызывает событие click для данного элемента. Но в некоторых случаях действие щелчка невозможно.
Например, если мы хотим щелкнуть отключенный элемент. В этом случае WebElement#click
выдает исключение IllegalStateException
. Вместо этого мы можем использовать поддержку JavaScript в Selenium.
Для этого первое, что нам понадобится, это JavascriptExecutor
. Поскольку мы используем реализацию ChromeDriver
, мы можем просто привести ее к тому, что нам нужно:
JavascriptExecutor executor = (JavascriptExecutor) driver;
После получения JavascriptExecutor
мы можем использовать его метод executeScript
. Аргументами являются сам скрипт и массив параметров скрипта. В нашем случае мы вызываем метод click для первого аргумента:
executor.executeScript("arguments[0].click();", element);
Теперь давайте объединим это в один метод, который мы назовем clickElement
:
private void clickElement(WebElement element) {
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", element);
}
И, наконец, мы можем добавить это к нашему тесту:
@Test
public void whenSearchForSeleniumArticles_thenReturnNotEmptyResults() {
// ... load https://foreach.com
WebElement searchButton = driver.findElement(By.className("nav--menu_item_anchor"));
clickElement(searchButton);
WebElement searchInput = driver.findElement(By.id("search"));
searchInput.sendKeys("Selenium");
WebElement seeSearchResultsButton = driver.findElement(By.cssSelector(".btn-search"));
clickElement(seeSearchResultsButton);
}
6. Некликабельные элементы
Одна из наиболее распространенных проблем, возникающих при нажатии на элемент с помощью JavaScript, заключается в выполнении скрипта клика до того, как элемент станет доступным для клика. В этой ситуации действие щелчка не произойдет, но код продолжит выполняться.
Чтобы решить эту проблему, мы должны приостановить выполнение до тех пор, пока не станет доступен щелчок. Мы можем использовать WebDriverWait#until
, чтобы дождаться отображения кнопки.
Во- первых, объекту
WebDriverWait
требуются два параметра; драйвер и тайм-аут:
WebDriverWait wait = new WebDriverWait(driver, 5000);
Затем мы вызываем until
, давая ожидаемое условие elementToBeClickable
:
wait.until(ExpectedConditions.elementToBeClickable(By.className("nav--menu_item_anchor")));
И как только это завершится успешно, мы знаем, что можем продолжить:
WebElement searchButton = driver.findElement(By.className("nav--menu_item_anchor"));
clickElement(searchButton);
Более доступные методы условия смотрите в официальной документации .
7. Заключение
В этом уроке мы узнали, как щелкнуть элемент в Selenium с помощью JavaScript. Как всегда, исходники статьи доступны на GitHub .