我在前面说过基于录制、回放的web测试麻烦多多,经常是带来的好处不如麻烦多。所以另寻他途。经过一番调研,觉得webdriver(也即selenium 2.0)前途较好,准备试用。webdriver支持多种语言,我们的项目是基于java编写的,按说用java能够更好的和项目集成。但考虑到刚开始用,快速上手很有必要,使用环境越轻量级越好。于是采用watir——Web Application Test In Ruby。我对ruby的了解仅限于听说过这个名称,好在网上有不少教程,而且快速展开测试也并不需要多深入的学习语言本身。使用ruby还有个好处就是它是一种解释性语言,可以即时调试。
安装没什么难度(其实比网上的一些例子更容易,因为版本高了,很多工作不用准备了)
1.安装ruby,最新2.1,我装的是2.0。一路next完成。(devkit貌似不装也可以)
2.gem update --system (不升级也可以,自带的版本也够)
3.gem install watir 以及gem install watir-webdriver (可以用gem list看一下,如果已经包括了,这步也省了)
4.如果需要用ie和chrome测试,那么下载这两个的驱动:地址是,ie的:http://code.google.com/p/selenium/downloads/list chrome的:http://chromedriver.storage.googleapis.com/index.html
(关于chrome驱动得多说两句——因为这个问题费了我十几个小时的脑力。这个地址是我排查错误时找到的。网上大部分说法是在这里下http://code.google.com/p/chromedriver/downloads/list。但是这里搜到的最高版本才2.3,当chrome版本超过30,就不适用了。所以我用chrome测试失败之后,尝试很久才发现是驱动版本问题。驱动版本并非越高越好,要在上面我给出的地址里找到和chrome版本对应的驱动才行)
下面说说我在简单试用中发现的问题和最后的解决办法。
1.chrome驱动算一个,不重复了。
2.大多时候我们快速开始于一些简单的例子。比如测试百度、google。因为这两个页面看上去似乎非常简单,一个文本输入框,一个检索按钮。然而,打开百度、google首页的源代码,我们发现,这些页面内容远比展现出来的复杂的多,页面元素一层一层嵌套,想找个id和name都不容易。所以开始给我造成一些迷惑以至于让我对webdriver颇为忧虑。
举个例子,我用一段脚本在ie里执行没问题,换到firefox就不行。让我对使用watir进行浏览器兼容性测试没了信心。如果换浏览器还要重新调试脚本的话,那么跟手工做没太大区别了。后来经过仔细调试,发现是因为——ie驱动的容错性更好导致的差别。具体来说,是页面中有元素的name属性重名,在ie里就正确识别出来了,而在firefox就报错了。都改用id属性就可以了,这样脚本就通用了。
3.然而更诡异的事情继续发生。一段脚本前一天执行还没问题,后一天就不行了。或者换台机器就不行了。这又是咋回事呢?经过排查,发现在百度和google首页中元素的id、name是变化的——我现在还没仔细验证是根据访问ip变化的还是根据访问时段变化的。简直是坑爹啊。好在测试自己的项目时不会发生这样的事。所以网上大部分教程用百度、google首页做例子并不适合,很容易调不通让新手一头雾水。
这样一来,也给我们自己开发时提了个醒,页面元素的id和name尽量唯一且固定。找到原因之后,我对watir有些信心了,在项目中准备正式用了。