Koja je razlika između implicitnog čekanja, eksplicitnog čekanja i tečnog čekanja u WebDriveru? Preciznije, kakav je odnos između WebDriverWait i FluentWait?
Evo primjera upotrebe svake metode čekanja u WebDriveru s Javom.
An implicitno čekanje je reći WebDriveru da anketira DOM određeno vrijeme kada pokušava pronaći element ili elemente ako nisu odmah dostupni. Zadana je postavka 0. Jednom postavljeno, implicitno čekanje postavlja se za život instance WebDriver objekta.
Primjer korištenja implicitnog čekanja
WebDriver driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get('http://somedomain/slow_loading_url'); WebElement dynamicElement = driver.findElement(By.id('dynamicElement'));
Kada bismo trebali koristiti implicitna čekanja?
Obično se ne preporučuje korištenje implicitnih čekanja kada možemo koristiti eksplicitna čekanja ili tečna čekanja.
An izričito čekanje je kod koji definirate da pričekate da se dogodi određeno stanje prije nego što nastavite dalje s kodom. WebDriverWait prema zadanim postavkama poziva ExpectedCondition svakih 500 milisekundi dok se ne vrati uspješno.
Primjer korištenja eksplicitnog čekanja
WebDriver driver = new FirefoxDriver(); driver.get('http://somedomain/someurl'); WebElement dynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id('dynamicElement')));
Kada bismo trebali koristiti eksplicitna čekanja?
Obično bismo koristili eksplicitno čekanje ako elementu treba puno vremena za učitavanje. Također smo koristili eksplicitno čekanje za provjeru CSS svojstva elementa (prisutnost, klikljivost itd.) Koje se može promijeniti u Ajax aplikacijama.
Kada koristimo instancu FluentWait, možemo odrediti:
Primjer upotrebe FluentWait-a
// Waiting 30 seconds for an element to be present on the page, checking // for its presence once every 5 seconds. Wait wait = new FluentWait(driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class); WebElement foo = wait.until(new Function() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id('foo')); } });
Kada bismo trebali koristiti FluentWait?
Kada pokušate testirati prisutnost elementa koji se može pojaviti nakon svakih x sekundi / minuta.
WebDriverWait je podrazred FluentWait. U FluentWait-u imate više mogućnosti za konfiguriranje, zajedno s maksimalnim vremenom čekanja, poput intervala glasanja, izuzetaka koje treba zanemariti itd.
Dakle, umjesto čekanja, a zatim korištenja findElement
:
WebDriverWait wait = new WebDriverWait(driver, 18); wait.until(ExpectedConditions.elementToBeClickable(By.linkText('Account'))); WebElement element = driver.findElement(By.linkText('Account')); element.sendKeys(Keys.CONTROL); element.click();
možemo koristiti:
WebElement element = wait.until(
ExpectedConditions.elementToBeClickable(By.linkText('Account')));
Daljnje čitanje: