Selenium 2 已经发布了一个多月,官方版本已经到了Selenium 2.3,并且在Google code里面可以找到2.4的下载。Selenium 2 最大的更新就是集成了WebDriver。这两者是什么关系呢?如果你搜索WebDriver,第一条结果是Selenium。其实WebDriver和Selenium可以说是在实现UI Automation的竞争对手。Selenium是运行在JavaScript的sandbox里面,所以很容易就支持不同的浏览器;而WebDriver则是直接操作浏览器本身,更接近用户的真实操作,但正因为如此,所以WebDriver在多浏览器/操作系统的支持上就要落后于Selenium。不过从Selenium 2开始,这两个项目合并了,可以继续用原来的Selenium,也可以考虑迁移到WebDriver。我个人认为WebDriver应该是以后的大趋势,还是值得迁移的。至于你信不信,我反正是信了。
作为一个轻量级的UI Automation框架,需要写一些驱动它的代码,大部分人会选择JUnit,因为JUnit是单元测试的事实标准;但是我会用TestNG。这些UI Automation的东西,它们本身不是单元测试,而且也没有太多单元测试的风格。
从一段简单的测试开始
public class GoogleTest { @Test public void search(ITestContext context) { WebDriver driver = new FirefoxDriver(); driver.get("http://www.google.com"); WebElement element = driver.findElement(By.name("q")); element.sendKeys("magus"); element.submit(); Assert.assertTrue(driver.getTitle().contains("magus"), "Something wrong with title"); } }
TestNG应用了Java的Annotations,只需要在测试方法上面打上@Test就可以标示出search是一个测试方法。用TestNG运行测试还需要一个testng.xml的文件,文件名其实可以随便起,没有关系的。
我想让测试更加灵活,1. 可以配置使用任意支持的浏览器进行测试;2. 配置所有Google的URL;3. 配置搜索的关键字。修改后的代码:
public class GoogleTest { WebDriver driver; @Parameters({"browser"}) @BeforeTest public void setupBrowser(String browser){ if (browser.equals("firefox")){ driver = new FirefoxDriver(); } else { driver = new ChromeDriver(); } } @Parameters({ "url", "keyword" }) @Test public void search(String url, String keyword, ITestContext context) { driver.get(url); WebElement element = driver.findElement(By.name("q")); element.sendKeys(keyword); element.submit(); Assert.assertTrue(driver.getTitle().contains(keyword), "Something wrong with title"); } }
testng.xml
利用TestNG的@Parameters标签,让测试方法从testng.xml里面读取参数,实现参数化。在testng.xml的配置中,test节点需要增加一个属性的配置: preserve-order=”true”。这个preserve-order默认是false,在节点下面的所有方法的执行顺序是无序的。把它设为true以后就能保证在节点下的方法是按照顺序执行的。TestNG的这个功能可以方便我们在testng.xml里面拼装测试。假设我们有很多独立的测试方法,例如
- navigateCategory
- addComment
- addFriend
- login
- logout
就可以在testng.xml里面拼出不同的测试,例如
TestNG比JUnit更加适合做一些非单元测试的事情,不是说JUnit不好,而是不能把JUnit当成万能的锤子,到处钉钉子。WebDriver的API比Selenium的更加简洁,会是以后的大趋势。
之后打算分享一下如何用ant把自动化测试自动化起来。
你好~ 我最近也在玩自动化
Selenium RC + TestNG 没问题
WebDriver + TestNG 报了点错,什么包没有,能请教下WebDriver+testng 需要哪些jar包吗?
FAILED CONFIGURATION: @BeforeSuite setUp
java.lang.NoClassDefFoundError: com/google/common/base/Function
LikeLike
你好,你这个情况是因为你只引用了selenium java client的jar包,但是其实你还需要引用一下webdriver里面的那个standalone的jar包。现在最新的版本是selenium-server-standalone-2.16.1.jar :)
LikeLike
嗯~ 谢谢OK
LikeLike
你好,能请问一下org.openqa.selenium.remote.UnreachableBrowserException: Error communicating with the remote browser. It may have died.
这个问题是怎么回事么。
我导出脚本junit rc 就能pass 但是导出webdriver就会出这个错。。请问是配置有问题吗?
LikeLike
你好,请问你用的Selenium2 版本和浏览器版本是不是比较新的呢?
是一跑起来就出错,还是跑了一段时间才出现这个错误?
出错的地方是不是这句话? driver.quit()
LikeLike
谢谢啊,刚开始研究这个,帮助很大 …
LikeLike
多谢鼓励 :)
LikeLike
wow, a good toturial for a testNG beginer(me), thanks for your sharing.
LikeLike
我在命令行下执行遇到这个问题java.lang.NoClassDefFoundError: com/google/common/base/Function,看了您的说明,OK了。但疑惑的是在eclipse中的build path中没有添加selenium-server-standalone-2.40.0.jar,为何就能正常运行WebDriver代码?(打开的是本机的浏览器)
LikeLike
test.xml 显示不出来呀 是什么原因。此外代码里不需要设置 friefox.exe的系统安装位置么
LikeLike