WebDriver接口的manage()方法会返回一个Option接口。Option接口是这样描述的:An interfacefor managing stuff you would do in a browser menu(用于管理您在浏览器菜单中执行的操作的界面),Option的中文意思是“选项”,言外之意就是浏览器选项。所以,这些操作都是来控制浏览器本身。Option接口中的timesout()方法可以返回Timeout接口。
Timeout接口中的方法:(就三个)
implicitlyWait(long time, TimeUnit unit);
setScriptTimeout(long time, TimeUnit unit);
pageLoadTimeout(long time, TimeUnit unit);
先看看implicitlyWait(),这个在前面介绍过了,叫隐式时间等待。我们来看看这个接口的描述部分,大致意思是:隐式时间等待是在查找元素的时候,设置一个最大时间值,如果driver第一次没有找到网页元素,那么就继续找,直到消耗了设置的最大时间值,还是没有找到,那么就抛出没有找到元素的异常。如果在设置时间范围内就找到了该元素,那么就执行下一行代码,不需要再等时间,这就是隐式等待的含义。所以,隐式时间等待一般结合查找网页元素一起。
setScriptTimeout(),作用是,在设置规定的时间内,等待异步脚本的执行结束,而不是里面抛出错误。这个在执行javascript脚本的时候可能会使用,后面我们介绍了使用Javascript脚本执行Selenium相关操作后在介绍具体使用方法。
pageLoadTimeout(),字面意思就网页加载超时,作用就是在设置规定时间内,等待网页完整加载完成,而不是里面抛出错误。我们知道如果网速慢,或者网页元素太多,例如网页做了大面积渲染,肯定会造成网页加载速度变慢。这个接口的作用就是,来处理这类问题的。从这个角度来看,我们前面的脚本中设置时间等待的语句应该换成这个语句更合适一些,毕竟我们的目的就是等待网页加载完成。
这里用pageLoadTimeout()举例一个打开百度和打开国外站点的例子,百度首页打开设置2秒,国外站点(icloud.com)打开设置1秒,由于中国大陆访问国外网站速度肯定慢,所以会报超时错误。
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class PageLoadTest {
public static void main(String[] args) {
System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().pageLoadTimeout(1,TimeUnit.SECONDS);
driver.get("https://www.icloud.com/"); }
}
运行会报错
把上面的超时时间设置10秒,然后运行,就应该不会报这个超时的错误。我测试过5秒,也不会报超时。
以后我们把这些Selenium方法或者接口分成三类,一类是driver相关,也就是操作浏览器本身设置,第二类是元素相关,就是一些元素的点击,输入等操作,第三类是一些工具支持类,例如截图,日志输出,事件监听。