В отличии от неявного ожидания, безусловно притормаживающего программу на определенное время, методы явного ожидания останавливают выполнение программы до момента выполнения некоторого условия, которое может выполнится, а может не выполнится в течение определенного времени. Другими словами, процесс явного ожидания может прерываться выполнением определенного условия.
Для удобства, большинство таких определенных условий, которые можно использовать для прерывания явного ожидания собраны в классе
org.openqa.selenium.support.ui.ExpectedConditions
вот самые полезные из них:
- alertIsPresent()
- elementSelectionStateToBe()
- elementToBeClickable()
- elementToBeSelected()
- frameToBeAvaliableAndSwitchToIt()
- invisibilityOfTheElementLocated()
- invisibilityOfElementWithText()
- presenceOfAllElementsLocatedBy()
- presenceOfElementLocated()
- textToBePresentInElement()
- textToBePresentInElementLocated()
- textToBePresentInElementValue()
- titleIs()
- titleContains()
- visibilityOf()
- visibilityOfAllElements()
- visibilityOfAllElementsLocatedBy()
- visibilityOfElementLocated()
Что бы иметь возможность работать с методами явного ожидания нужно импортировать следующие классы:
import org.openqa.selenium.support.ui.ExpectedConditions
import org.openqa.selenium.support.ui.WebDriverWait
и создать объект класса WebDriverWait :
WebDriverWait wait = new WebDriverWait(driver, 30);
здесь к переменной wait привязывается ссылка на экземпляр класса WebDriverWait, в конструктор класса передается ссылка на объект WebDriver, и значение периода времени в секундах, по истечении которого WebDriverWait выбросит исключение NotFoundException, если не будет удовлетворено условие прерывания явного ожидания.
Пример использования Explicit Wait :
Итак, настало время для примера. Ниже расположен код программы, которая после успешной авторизации на почтовом сервисе gmail.com ожидает появление на экране кнопки "Написать", после того, как веб-элемент становится доступным, программа "нажимает" на него.
package explicitWaitExample;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class ExpectedConditionExample {
// создаем ссылку на WebDriver
WebDriver driver;
@BeforeMethod
public void setup() throws InterruptedException {
// присваиваем переменной driver ссылку на экземпляр FirefoxDriver
driver=new FirefoxDriver();
// переходим на gmail.com в браузере
driver.get("https://gmail.com");
// разворачиваем окно браузера на весь экран
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
@Test
public void test() throws InterruptedException {
// в element будет храниться ссылка на веб-элемент с id="Email"
WebElement element = driver.findElement(By.id("Email"));
// вводим имя пользователя
element.sendKeys("pupkin@gmail.com");
element.sendKeys(Keys.RETURN);
// ищем веб-элемент с id="Passwd" и вводим в него пароль
driver.findElement(By.id("Passwd")).sendKeys("password");
// ищем веб-элемент с id="signIn" и "нажимаем" на него
driver.findElement(By.id("signIn")).click();
/* Собственно само ЯВНОЕ ОЖИДАНИЕ, пока элемент, содержащий текст "COMPOSE" станет видимым */
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[contains(text(),'COMPOSE')]")));
/* этот код будет исполнятся в случае, если кнопка "COMPOSE"
стала видимой, иначе будет выброшено исключение NotFoundException */
driver.findElement(By.xpath("//div[contains(text(),'COMPOSE')]")).click();
}
@AfterMethod
public void teardown() {
// закрываем все окна и вкладки браузера
driver.quit();
}
}
After that, it will click on the “Compose” button. In this case, the program will not wait for the entire 30 seconds, thus saving time and executing the script faster.
Этот код предписывает Selenium WebDriver ожидать 30 секунд перед тем выбросить TimeoutException. Если веб-элемент станет видимым раньше этого срока, процесс ожидания сразу же завершиться, программа сможет задействовать обнаруженную кнопку "Написать", и, тем самым, сэкономит время, выполнив программу быстрее, чем в случае с Неявным Ожиданием( Implicit Wait )