要執(zhí)行腳本,我們需要進(jìn)行適當(dāng)?shù)牟僮骱?,等待?yīng)用程序之間的同步。來(lái)看看以達(dá)到同樣的方式。
Thread.sleep代碼是一個(gè)靜態(tài)的等待,不是在腳本中使用,因?yàn)樗菬o(wú)需睡眠狀態(tài)的一個(gè)很好的方法。
Thread.Sleep(1000); //Will wait for 1 second.
一個(gè)明確的等待,等待某個(gè)條件進(jìn)一步處理之前發(fā)生。它主要用于當(dāng)我們想要點(diǎn)擊或采取行動(dòng)的對(duì)象,一旦它是可見(jiàn)的。
WebDriver driver = new FirefoxDriver(); driver.get("Enter an URL"S); WebElement DynamicElement = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(By.id("DynamicElement")));
隱式等待的情況下,如果網(wǎng)絡(luò)驅(qū)動(dòng)器找不到,因?yàn)樗牟豢捎眯缘牧⒓吹膶?duì)象。webdriver將等待指定的隱含的等待時(shí)間,也不會(huì)嘗試在指定時(shí)間內(nèi)找到的元素了。一旦指定的時(shí)間限制被超越,webdriver將嘗試再次搜索該元素的最后一面。如果成功,將繼續(xù)進(jìn)行執(zhí)行,但如果失敗,它會(huì)拋出異常。這是一種全局的等待,這意味著這種等待是適用于整個(gè)驅(qū)動(dòng)程序。因此,硬編碼這種等待更長(zhǎng)的時(shí)間時(shí)期將阻礙該腳本執(zhí)行時(shí)間。
WebDriver driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("Enter an URL"); WebElement DynamicElement = driver.findElement(By.id("DynamicElement"));
FluentWait用于當(dāng)webelement可以出現(xiàn)在5秒或者甚至它可以采取90秒。在這種情況下,我們定義的時(shí)間等待的狀態(tài)的最大數(shù)量,以及與該查詢(xún)的對(duì)象狀態(tài)的是否存在等的頻率。
讓我們假定,我們將60秒可用一個(gè)元素在網(wǎng)頁(yè)上,但每10秒檢查一次它的存在。
Wait wait = new FluentWait(driver) .withTimeout(60, SECONDS) .pollingEvery(10, SECONDS) .ignoring(NoSuchElementException.class); WebElement dynamicelement = wait.until(new Function<webdriver,webElement>() { public WebElement apply(WebDriver driver) { return driver.findElement(By.id("dynamicelement")); } } );