|
Timeouts()方法会获得Timeouts对象,Timeouts对象包含以下3个方法。
ImplicitlyWait(),设置脚本在查找元素时的最大等待时间,例如Findelement()和Find Elemets()等方法的超时时间。
SetPageLoadTimeout():页面操作超时时间,例如页面进行跳转或刷新的最大等待时间。例如:使用Navigation 对象的各个方法,以及在页面执行某操作后发生跳转或刷新
SetScriptTimeout(),设置脚本异步执行的超时时间。
示例:
WebDriver driver = new FirefoxDriver();
Timeouts timeouts =driver.manage().timeouts();
//将脚本在查找元素时的最大等待时间设置为30s
timeouts.implicitlyWait(30,java.util.concurrent.TimeUnit.SECONDS);
//将页面跳转或刷新的超时时间设置为30s
timeouts.pageLoadTimeout(30,java.util.concurrent.TimeUnit.SECONDS);
//将脚本异步执行的超时时间设置为30s
timeouts.setScriptTimeout(30,java.util.concurrent.TimeUnit.SECONDS);
为测试操作添加事件:
如果想要在执行测试操作时执行自定义的处理或者进行截图,可以适用EventFiring-WebDriver。它可以为各个操作添加事件,并能对测试进行截图。
假如现在要对各类操作执行以下自定义处理。
1、在执行打开网页的操作时,需要分别记录打开前和打开后的URL地址。
2、在查找某个页面元素时,查找之前和之后都需要记录查找条件。
3、在对页面元素进行单击操作时,单击前需要记录元素的查找条件,单击后记录URL地址
4、在对页面元素的值进行更改时,需要分别记录更改前的值和更改后的值。
5、在发生异常的时候需要进行截图,将截图文件保存至D:\,用当前日期命令截图文件。
要实现以上的自定义处理,可以通过EventFiringWebDriver轻松实现。
在Java中,可以通过下面的方式来实例化EventFiringWebDriver对象
WebDriver driver = new FireDriver();
org.openqa.selenium.support.events.EventFiringWebDriver eventDriver = new org.openqa.selenium.support.events.EventFiringWebDriver(diver)
以下事件的作用:
beforeNavigate To:导航前事件,定义页面在发生跳转前需要执行的代码。
afterNavigate To:导航后事件,定义页面在发生跳转后需要执行的代码。
beforeNavigateBack:浏览器后退事件,定义浏览器在执行后退操作前需要执行的代码。
afterNavigateBack:浏览器后退后事件,定义浏览器在执行后退操作后需要执行的代码。
beforNavigateForward:浏览器前进前事件,定义浏览器在执行前进操作前需要执行的代码。
afterNavigateForward:浏览器前进后事件,定义浏览器在执行前进行操作后需要执行的代码。
beforFindBy:查找元素前事件,定义Selenium在查找元素前需要执行的代码。
afterFindBy:找到元素后事件,定义Selenium在找到元素后需要执行的代码。
beforeClickOn:单击元素前事件,定义Selenium在单击元素前需要执行的代码。
afterClickOn:单击元素后事件,定义Selenium在单击元素后需要执行的代码。
beforeChangeValueOf:元素值变更前事件,定义Selenium更改元素的值前需要执行的代码。
afterChangeValueOf:元素值变更后事件,定义Selenium更改元素的值后需要执行的代码。
beforeScript:脚本执行前事件,定义脚本执行前需要执行的代码。
afterScript:脚本执行后事件,定义脚本执行后需要执行的代码。
onException:异常事件,定义在使用Selenium测试发生异常时需要执行的代码。
程序片段:
package Project1;
import org.openqa.selenium.*;
import org.openqa.selenium.WebDriver.*;
import org.openqa.selenium.firefox.*;
public class Project1{
public static void main(String[] args){
//如果启动出现问题,可以使用System.setProperty指出firefox.exe的路径
//System.setProperty("webdriver.firefox.bin","D:\\Program Files(x86)\\Mozilla Firefox\\firefox.exe");
WebDriver driver = newFirefoxDriver();
org.openqa.selenium.support.events.EventFiringWebDriver eventDriver = new org.openqa.selenium.support.events.EventFiringWebDriver(driver);
//注册事件
eventDriver.register(new MyWebDriverListener());
//打开百度页面
eventDriver.navigate().to(http://www.baidu.com);
//在搜索框中输入Selenium
eventDriver.findElement(By.id("kw")).sendKeys("selenium");
//单击搜索
eventDriver.findElement(By.id("su")).click();
//故意写一个错误操作,使selenium产生一场
try
{
eventDriver.findElement(By.id("XXX"));
}
catch(Exception e){}
}
}
-----------------------------MyWebDriverListener.java文件-----------------------------------------------------------------------------------------------------------------
package Project1;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
public class MyWebDriverListener implements org.openqa.selenium.support.events.WebDriverEventListener{
@override
public void beforeNavigateTo(String url,WebDriver driver)
{
System.out.println("页面在发生跳转前的Url为:"+driver.getCurrentUrl());
}
@Override
public void afterNavigateTo(String url,WebDriver driver){
System.out.println("页面在发生跳转后的Url为:"+driver.getCurrentUrl());
}
@Override
public void beforeNavigateBack(WebDriver driver){}
@Override
public void afterNavigateBack(WebDriver driver){}
@Override
public void beforeNavigateForward(WebDriver driver){}
@Override
public void afterNavigateForward(WebDriver driver){}
@Override
public void beforeFindBy(By by,WebElement element,WebDriver driver){
System.out.println("查找元素时的条件为:"+by.toString());
}
@Override
public void afterFindBy(By by,WebElement element,WebDriver driver){
System.out.println("找到元素,其条件为:"+by.toString());
}
@Override
public void beforeClickOn(WebElement element,WebDriver driver){
System.out.println("要单击的页面元素为:"+element.getAttribute("value"));
@Override
public void afterClickOn(WebElement element,WebDriver driver){
try{
Thread.sleep(4000);
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println("单击页面元素后的Url为:"+driver.getCurrentUrl());
}
@Override
public void beforeChangeValueOf(WebElement element,WebDriver driver){
System.out.println("更改前的值为:"+element.getAttribute("value"));
}
@Override
public void afterChangeValueOf(WebElement element,WebDriver driver){
System.out.println("更改后的值为:"+element.getAttribute("value"));
}
@Override
public void beforeScript(String script,WebDriver driver){}
@Override
public void afterScript(String script,WebDriver driver){}
@Override
public void onException(Throwable throwable,WebDriver driver)
{
java.util.Date currentTime = new java.util.Date();
java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy_MM_dd_hh_mm_ss");
String dateString = formatter.format(currentTime);
java.io.File scrFile = ((org.openqa.selenium.TakesScreenshot)driver).getScreenshotAs(org.openqa.selenium.OutputType.FILE);
try{
java.io.File screenshot = new java.io.File("D:\\"+dateString+".png");
}
catch(Exception e){
e.printStackTrace();
}
System.out.println("发生异常,原因为:"+throwable.getMessage());
System.out.println("截图已保存至:"+"d:\\"+dateString+".png");
}
}