Java+Selenium3方法篇2-Timeout接口相关方法介绍

       这一篇介绍manage()接口下常用方法的使用。从Selenium的源码文件,可以知道,manage是得到Option这类接口用的。本文介绍的方法,都是在Option这个接口下面可以找到的。Option接口是这样描述的:An interfacefor managing stuff you would do in a browser menu,所以,这些操作都是来控制浏览器本身。

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秒,由于中国大陆访问国外网站速度肯定慢,所以会报超时错误。

相关脚本代码如下:

package lessons;

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");
		//System.setProperty("webdriver.gecko.driver", ".\\Tools\\geckodriver.exe");
		
		WebDriver driver = new ChromeDriver();
		//WebDriver driver = new FirefoxDriver();
	
		driver.manage().window().maximize();
		
		driver.manage().timeouts().pageLoadTimeout(1,TimeUnit.SECONDS);
		driver.get("https://www.icloud.com/");
		
		
	}


}
运行应该报超时错误,大致如下
[4.674][SEVERE]: Timed out receiving message from renderer: 0.318
[4.678][SEVERE]: Timed out receiving message from renderer: -0.004
Exception in thread "main" org.openqa.selenium.TimeoutException: timeout
  (Session info: chrome=57.0.2987.133)
  (Driver info: chromedriver=2.29.461591 (62ebf098771772160f391d75e589dc567915b233),platform=Windows NT 6.1.7601 SP1 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 995 milliseconds
Build info: version: '3.4.0', revision: 'unknown', time: 'unknown'
System info: host: 'YDBJ0140', ip: '10.10.20.65', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_111'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.29.461591 (62ebf098771772160f391d75e589dc567915b233), userDataDir=C:\Users\ydbj0140\AppData\Local\Temp\scoped_dir12856_30817}, takesHeapSnapshot=true, pageLoadStrategy=normal, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=57.0.2987.133, platform=XP, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true, unexpectedAlertBehaviour=}]
Session ID: b1486a90a7c7be9c0870b9d725caea32
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:215)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:167)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:671)
    at org.openqa.selenium.remote.RemoteWebDriver.get(RemoteWebDriver.java:364)
    at lessons.PageLoadTest.main(PageLoadTest.java:23)


把上面的超时时间设置10秒,然后运行,就应该不会报这个超时的错误。我测试过5秒,也不会报超时。

       以后我们把这些Selenium方法或者接口分成三类,一类是driver相关,也就是操作浏览器本身设置,第二类是元素相关,就是一些元素的点击,输入等操作,第三类是一些工具支持类,例如截图,日志输出,事件监听。




你可能感兴趣的:(Java+Selenium3方法篇2-Timeout接口相关方法介绍)