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的需要在构造函数或函数里设置为但不能保证它的行为与浏览器的一样而且不是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再决定是否升级。