原文地址:http://blog.sina.com.cn/s/blog_93b1f3f001013xng.html
Selenium是一个用于Web应用程序测试的工具。Selenium直接运行在浏览器中,就像真正的用户在操作一样。
Selenium2.0 java的一个简单示例如下:
WebDriver driver = newFirefoxDriver(); //启动firefox浏览器
driver.manage().window().maximize(); //最大化浏览器
driver.get(“http://www.sina.com.cn”); //访问一个页面
System.out.println(driver.getPageSource()); //打印页面源码
driver.quit(); //退出浏览器
get方法访问一个页面,当调用get方法时,WebDriver会一直阻塞直到该页面完全加载完成。若一个页面加载速度过慢,则会导致get方法一直阻塞,因此有时候需要对get方法设定一个超时时间,当加载超时时停止加载。设定超时的方法有两种,第一种是用selenium提供的页面加载超时方法,如:
driver.manage().timeouts().pageLoadTimeout(1,TimeUnit.SECONDS);
try{
driver.get("http://www.sina.com.cn");
driver.quit();
} catch(TimeoutException e) {
driver.quit();
}
当超时时,任何关于driver的操作都会被阻塞,只有driver.quit()会立即关闭浏览器,销毁浏览器对应的资源。pageloadTimeout方法只适用于firefox浏览器,Chrome等其他浏览器并不适用,但我们可以自己实现一个定时器,如:
Timertimer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
//TODO Auto-generated method stub
driver.quit();
}
},1000);
driver.get("http://www.sina.com.cn");
timer.cancel();
一些web应用程序有许多Frames或多个Windows。WebDriver支持使用“switchTo”的方法实现的窗口之间切换。以下示例展示了如何关闭除主窗口之外的其它窗口:
StringparentWindowHandle = driver.getWindowHandle();
Iterator windowIterator =driver.getWindowHandles().iterator();
while(windowIterator.hasNext()) {
String windowHandle = windowIterator.next();
if (!windowHandle.equals(parentWindowHandle)) {
driver.switchTo().window(windowHandle);
driver.close();
}
}
driver.switchTo().window(parentWindowHandle);
有的Web应用程序会弹出窗口,也可以通过switchTo在主窗口和弹出窗口之间切换,如:
Alertalert = driver.switchTo().alert();
alert.accept();
若要定位网络中的UI元素,可以通过findElement及findElements的方法,第一个方法返回一个WebElement或者抛出异常。后者返回所有WebElement的列表,或者空列表。获取和定位元素一般调用By方法,包括By ID、ByClass Name、By TagName、ByName、By LinkText、By Partial LinkText、By CSS以及ByXPATH等。例:
WebElementelement =driver.findElement(By.xpath("//input[@id=\"form_submit\"]";
查找元素时,也可以设定超时,比较方便地方法是全局设定,如:
driver.manage().timeouts().implicitlyWait(1,TimeUnit.SECONDS);
当查找到的元素时IFrame时,则可和Windows之间可以进行切换,如:
driver.switchTo().frame(element);
当查找到的元素可点击时(比如按钮、单选框、多选框、链接等),则可调用click方法进行点击,如:
element.click();
一般,调用click方法,点击发生在元素的中间位置,若想点击元素的其它地方,可以调用moveToElement的方法,如:
(newActions(driver)).moveToElement(element, 20,20).click().perform();
一些可点击的元素点击后,可能会跳到一个新的页面,通过windows的切换可获取到新页面的url及title,如:
element.click();
StringparentWindowHandle = driver.getWindowHandle();
Iterator windowIterator =driver.getWindowHandles().iterator();
while(windowIterator.hasNext()) {
String windowHandle = windowIterator.next();
if(!windowHandle.equals(parentWindowHandle)) {
driver.switchTo().window(windowHandle);
break;
}
}
System.out.println(driver.getCurrentUrl());
System.out.println(driver.getTitle());
在Firefox中,页面发生切换后,立即通过getCurrentUrl获取新页面url可能会返回"about:blank",过段时间再通过getCurrentUrl时,才能返回正确的url,介于此,修改getCurrentUrl方法如下:
StringgetCurrentUrl() {
String url = "";
int maxRetry = 10;
url = driver.getCurrentUrl();
while (url.trim().equalsIgnoreCase("about:blank") &&maxRetry > 0)
{
Thread.sleep(1000);
url = driver.getCurrentUrl();
maxRetry--;
}
return url;
}