通用技术 小而美的 ghost driver

乙醇 · 2015年01月12日 · 最后由 dabao 回复于 2015年01月29日 · 2805 次阅读
本帖已被设为精华帖!

做过 selenium 自动化项目的同学应该都遇到过这样的问题:测试用例太多,运行速度过慢导致团队成员怨声载道。

于是便有了 selenium grid 和多线程运行 selenium 测试用例的方法。这些方法各有利弊这里就不一一列举了。但总的来说,如果浏览器运行的速度足够快,那么多线程并发时的用例执行速度应该是可以满足实际项目需求的。

再想象一下这样的情景:如果你手头的机器是没有 gui 的 (这是可能的,我以前的几台 centos 的 server 根本就没有 ui),如何在这样的 headless 的机器上运行 selenium 用例呢?

答案是可以用 selenium 自带的HtmlUnitDriver。不过可惜的是 HtmlUnitDriver 对 js 的支持不是特别完美,所以该方案可行但是不完善,不是特别适合用于真实项目。

好在现在有了phantomjs和 ghostdriver,我们可以用 ghostdriver 来运行 selenium 测试用例。所有的用例都是在没有 gui 的浏览器里运行,运行速度可以得到极大的提升。再加上 phantomjs 是基于 webkit 的,所以 ghostdriver 完全可以模拟 chrome 和 safari 的行为。

在我的 macbookpro 上,chromedriver 的表现不是特别令人满意,而我又没有安装 firefox 和 safari driver,所以对于一般的页面 (js 交互不是特别多的页面),我都是用 ghost driver 在调试问题,快速而简便。最主要是没有真实的浏览器弹出来,不会像 chromedriver 那样经常意外退出造成内存泄漏,也不会像 firefox 那样运行缓慢。

下面简单介绍一下 ghost driver 与 selenium 合体的过程。

背景知识

下面的内容要求你已经成功的安装好 python 的 selenim binding。如果你有 pip,直接运行 pip install selenium即可。如果被墙,请使用豆瓣源。

或者成功的安装好 ruby 的 watir-webdriver。如果你有 gem,直接运行 gem install watir-webdriver即可。如果被墙,请使用淘宝源

安装 ghost driver

ghost driver 现在已经跟 phantomjs 合体,所以安装好最新版本的 phantomjs 就等于安装好了 ghostdriver。

这里下载对应平台的 phantomjs。

  • 首先解压下载好的 zip 文件或 tar 文件 (linux only);

  • windows 用户将解压过后的得到的 phantomjs.exe 文件加入系统的 PATH 中。简单点说如果你使用 pyhon,就把 phantomjs.exe 放到 python 的安装目录下,ruby 用户放到 ruby/bin 目录下;

  • mac 和 linux 用户可以把解压后得到的 phantomjs 建个软链到/usr/local/bin 目录下。ln -s /where/is/phantomjs /usr/local/bin/phantomjs

快速开始

python 用户新建 itest.py 文件然后敲入下面的内容

from selenium import webdriver

dr = webdriver.PhantomJS('phantomjs')
dr.get('http://baidu.info')
print dr.title
print dr.current_url
dr.quit()

watir-webdriver 用户新建文件 itest.rb 然后敲入下面的内容

require 'watir-webdriver'

b = Watir::Browser.new :phantomjs
b.goto 'www.baidu.com'

puts b.title
puts b.url

b.close

讨论

  • ghostdriver 尽管对 js 的支持是不错的,但是如果你的页面上 js 交互过多的话,ghostdriver 是会缴械投降的;

  • 用 ghostdriver+selenium 的语法可以做一些不错的爬虫;

  • 用 java 用户请使用 maven 下载 java 的 ghostdriver binding;

  • 当页面上有 flash 播放器时,phantom 可能会萌萌哒的卡在那里一动不动;

  • ghostdriver 基于phantomjs,phantomjs 可以做爬虫,简单的性能测试,ui 自动化测试和其他一些工作;

  • 由于没有 ui,当测试发生错误的时候调试的工作量就会变大;

看不到运行的过程,心中惶恐不安怎么办

答案是截图拯救测试人员,截图拯救世界。

运行到关键的节点或步骤时截个图,即方便了调试又使你的测试拥有足够多的输出,一举两得何乐不为?

python 代码

from selenium import webdriver

dr = webdriver.PhantomJS('phantomjs')
dr.get('http://baidu.info')
print dr.title
print dr.current_url

dr.save_screenshot('./baidu.png')

dr.quit()

ruby 代码

require 'watir-webdriver'

b = Watir::Browser.new :phantomjs
b.goto 'www.baidu.com'

puts b.title
puts b.url
b.driver.save_screenshot('./baidu.jpg')

b.close
共收到 8 条回复 时间 点赞

大神,为什么没有 Java?

@tspring java 需要用 java binding,有点麻烦,所以就没写了

@tspring 去 github 上搜 ghostdriver,我也只能帮你到这里了

这个太厉害了,以前基于 UI 的 web 自动化确实很蛋疼,刚试了下,挺不错的,就是官方下载的有点慢,在 CSDN 上找的一个资源下的。

抛弃 ui 的 ui 自动化测试,厉害!

@yangeren 不是抛弃,而是更有效率的运行。

这个 不错,mark 有空看一下

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册