Selenium的延遲等待分爲 顯式等待(Explicit Wait) & 隱式等待(Implicit Wait). css
1.顯式等待 java
顯式等待,就是明確的要等到某個元素的出現或者是某個元素的可點擊等條件,等不到,就一直等,除非在規定的時間以內都沒找到,那麼就跳出Exception. web
如: app
new WebDriverWait(driver, 15).until( ExpectedConditions.presenceOfElementLocated(By.cssSelector("css locator")) );
這裏,15是要等待的秒數.若是沒有知足until()方法中的條件,就會始終在這裏wait 15秒,依然找不到,就拋出異常. dom
也能夠這樣寫: ide
WebDriver driver = new FirefoxDriver(); driver.get( http://somedomain/url_that_delays_loading); WebElement e = (new WebDriverWait( driver, 10)) .until( new ExpectedCondition< WebElement>(){ @Override public WebElement apply( WebDriver d) { return d.findElement( By.id("id locator")); } } );
這樣就經過回調函數,直接得到了這個WebElement.也就是頁面元素. 函數
若是隻是僅僅想判斷頁面是否是加載到某個地方了,就能夠用第一種方法; 但若是須要獲得某個WebElement,兩種方式均可以,只是第一種方式還須要再多一步獲取的操做. url
Wait w = new Wait(){ @Override public boolean until() { return webElement.isDisplayed(); } };
另外這種等待的方式,在加載js代碼的時候作判斷會比較方便,反正我只在代碼裏這麼見過,可是沒用過,有興趣的朋友能夠研究一下. spa
2.隱式等待 code
隱式等待,我以爲就是不靠譜的等待,看一段代碼就明白了.
driver.manage().timeouts().implicitlyWait(second, TimeUnit.SECONDS);
WebDriver會進行一個隱式等待,但參數只有時間,這就致使我須要什麼元素出現,我不必定能等到它,只是讓driver延遲一段時間再繼續而已. 不過咱們也能夠把它小小的封裝一下,變廢爲寶:
public boolean isByElementDisplayed(By by, int time) { boolean status = false; if (driver.findElement(by).isDisplayed() == false) { driver.manage().timeouts().implicitlyWait(time, TimeUnit.SECONDS); } else { status = true; } return status; }得不到某個元素,咱們就延遲一下...
最後還有一個最低效的作法:
Thread.sleep()
額,不建議使用.
第一次發文,你們多提意見.