Selenium2
Overview
WebDriver摇身一变成了Selenium2.0,对比与Selenium1.0,它直接调用浏览器核心API的方式,比1.0的JavaScript方式快了,另外它的By的locator也比1.0时的String清晰,Wait某个事件的API也进步了。
但它其他的API就没有1.0方便,但也就这水平,居然搞成了W3C规范的草稿
所以, SpringSide在Test Module里提供了一个Selenium2.java的封装,融合了两者的优点,让API重新变得友好。重新的封装时,参考了它那个向后兼容的WebDriverBackedSelenium的实现。WebDriverBackedSelenium有些地方还是用Javascript来实现的,有些API又没有实现,所以没有直接使用它。
Selenium2.java
1.setStopAtShutdown()
在JVM退出时关闭Selenium。因为每次创建Selenium实体都需要相当的消耗,因此希望在整个测试过程中只启动一次Selenium。
但Junit没有所有测试完毕后执行某函数的概念,因此注册了一个JVM的shutdown hook,在JVM退出时调用selenium的quit()方法。
2. waitForPageLoad()
selenium1.0的waitForPageLoad(timeout)函数没有了,而那些承诺会block住直到页面完全打开的get(url),click(by)函数,在firefox下一点效果没有。
好在有另一个解决方式,implicitlyWait会findByElement()失败时,隐式等待直到Element出现。 这样,就连1.0那句烦人的waitForPage()也省了。
driver.manage().timeouts().implicitlyWait(seconds, TimeUnit.SECONDS);
3. 出错时自动snapshot
selenium1.0非常重要的功能,可以在页面出错的一刹那进行截屏,一图胜千言,好过慢慢看log猜在哪一步错了,有时候还猜不出来。 还写了个Junit的Rule,自动化这个过程,在所有Selenium的基类了放入即可。
4. open(url)
2.0的driver.get(url)居然必须输入完整路径,不许使用相对路径。只好抄了下兼容函数,如果路径是相对路径时,自动补上baseUrl.
5. type(by,text)
2.0的type不会管input框里原来有没有值,只好自己补一个clean()上去.
6. check/uncheck/isChecked系列
2.0没有checkbox的check这个概念,只有isSelected, 又帮它向后兼容了一把。
7. Select系列
总算,在处理Select框时,support包里有个org.openqa.selenium.support.ui.Select,里面有一堆丰富的函数可用,如
s.getSelect(by).selectByValue(value);
s.getSelect(by).getFirstSelectedOption();
8. getValue(by)
唉, WebElement这个抽象的对象里,getValue需要调用element.getAttribute("value"),封装之。
9. waitfor系列
waitfor是Ajax 测试中很重要的功能,2.0的support包里另一个给力的对象,在Selenium2里封装了waitForTitleIs(title), waitForTitleContains(title),waitForTextPresent(by,text,timeout), waitForValuePresent(by,value,timeout), waitForVisible(by,timeout)
但ExpectedConditions里还有更多更多的条件可以使用,如:
s.waitForCondition(ExpectedConditions.xxxxxx(yyy,zzz), timeout);
10.其他1.0特有函数
- isTextPresent(text),简单粗暴的看看页面里有没有出现某文本。
- getTable(by, rowIndex, colIndex), 取得单元格中的text。
HtmlUnitDriver 与RemoteDriver
跑Jenkins的Linux机器上通常没有XWindows,不能运行真正的浏览器,这时候有两个选择:
一是HtmlUnitDriver,不使用真正的浏览器而是使用HtmlUnit,好处是速度超快(这点很重要),而且不需要XWindow。但它默认是不支持JavaScript的,需要在构造函数或setter函数里设置为true,但不能保证它的行为与浏览器的一样,而且不是100%的Javascript都支持,看运气,比如最新的JQuery1.9.1它又报错了,所以还是决定放弃掉。
另一个是RemoteDriver,再找一台Windows机器起一个Selenium Server, 下载一个selenium-server-standalone-2.xx.x.jar, 然后用java -jar selenium-server-standalone-2.xxx.x.jar运行起来,可以加-Dport=3333重新设置端口,默认是4444。
然后就可以参考WebDriverFactory里的方法,连接到http://hostname:4444/wd/hub,再指定希望的浏览器来执行。
WebDriverFactory.java
基于driverName字符串创建WebDriver的类,方便在配置文件和-D系统变量里随时切换测试浏览器。 既支持firefox,ie和chrome也支持Remotedriver的定义。
资料
- 电子书: \ Packt Oct. 2012, Selenium的文档很简单,而这本书不错。
- ChangeLog ,Selenium的版本更新飞快,看清楚Changelog再决定是否升级。