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()
额,不建议使用.
第一次发文,你们多提意见.