Перейти к основному содержимому

Нажатие элементов в Selenium с использованием JavaScript

· 3 мин. чтения

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 .