20
Selenium2
Calvin edited this page 2013-11-14 01:37:15 +08:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

##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的定义。

##资料

  • 电子书: <Selenium 2 Testing Tools> Packt Oct. 2012, Selenium的文档很简单,而这本书不错。
  • ChangeLog ,Selenium的版本更新飞快,看清楚Changelog再决定是否升级。