= 自动化测试 = - selenium 该测试框架对Firefox完美支持,其它浏览器的兼容性能有待商榷,据说浏览器兼容性是该框架的特色,比watir好[[BR]] 可以使用多种语言编写测试用例,可以使用Java,但是推荐使用[http://www.ruby-lang.org/zh_cn/documentation/ ruby]来编写,因为使用ruby来编写的话,语言简洁很多,而且测试人员可以很简单地去编写Ruby脚本[[BR]] 具有录制功能,但是只针对在firefox下,录制生成的脚本可以转为各种语言的测试用例。 - watir 该测试框架对ie有很好的支持 ---- == 安装:== - [http://files.rubyforge.vm.bytemark.co.uk/rubyinstaller/rubyinstaller-1.9.2-p290.exe window-下载ruby][[BR]] - [http://cloud.github.com/downloads/oneclick/rubyinstaller/DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe window-DevKit.exe版] [http://rubyforge.org/frs/download.php/66888/devkit-3.4.5r3-20091110.7z window-DevKit] [https://github.com/oneclick/rubyinstaller/downloads 更多DevKit] - 下载ruby 安装 , 修改系统path配置 , 命令行输入ruby -v - 下载DevKit 安装 (安装时,路径不要有空格) - 到DevKit安装目录,命令行 {{{ > cd > ruby dk.rb init #生成config.yml,这里会检查将要添加DevKit支持的Ruby列表,只支持通过RubyInstaller安装的Ruby #如果这里列出的Ruby与你的要求不符,可以手动修改 > ruby dk.rb review #检查要添加DevKit支持的Ruby列表是否有误,可以略过 > ruby dk.rb install [INFO] Updating convenience notice gem override for 'C:/Ruby192' [INFO] Installing 'C:/Ruby192/lib/ruby/site_ruby/devkit.rb' > }}} - 检查是否安装成功 {{{ > gem install selenium-webdriver }}} - selenium-webdriver 就是测试工具,安装成功即可 {{{ C:\Documents and Settings\pc>gem install selenium-webdriver Temporarily enhancing PATH to include DevKit... Building native extensions. This could take a while... Fetching: childprocess-0.3.2.gem (100%) Fetching: addressable-2.2.8.gem (100%) Fetching: libwebsocket-0.1.3.gem (100%) Fetching: selenium-webdriver-2.21.2.gem (100%) Successfully installed ffi-1.0.11 Successfully installed childprocess-0.3.2 Successfully installed addressable-2.2.8 Successfully installed libwebsocket-0.1.3 Successfully installed selenium-webdriver-2.21.2 5 gems installed Installing ri documentation for ffi-1.0.11... Installing ri documentation for childprocess-0.3.2... Installing ri documentation for addressable-2.2.8... Installing ri documentation for libwebsocket-0.1.3... Installing ri documentation for selenium-webdriver-2.21.2... Installing RDoc documentation for ffi-1.0.11... Installing RDoc documentation for childprocess-0.3.2... Installing RDoc documentation for addressable-2.2.8... Installing RDoc documentation for libwebsocket-0.1.3... Installing RDoc documentation for selenium-webdriver-2.21.2... }}} - 编写第一个案例,打开netbeans ,新建ruby工程 {{{ require 'rubygems' require 'selenium-webdriver' driver = Selenium::WebDriver.for :firefox driver.navigate.to "http://ks.pconline.com.cn/bbs.jsp" #sleep 3 element = driver.find_element(:name, 'q') element.send_keys "IPhone4S" element.submit puts driver.title driver.quit }}} = API使用及其例子 = - 解决中文字符问题 {{{ require 'rubygems' require 'selenium-webdriver' require 'iconv' class String def to_gbk Iconv.iconv("GBK//IGNORE","UTF-8//IGNORE",self).to_s end end driver = Selenium::WebDriver.for :ie driver.navigate.to "http://ks.pconline.com.cn/bbs.jsp" #sleep 3 element = driver.find_element(:name, 'q') element.send_keys "IPhone4S" element.submit puts "#{driver.title}".to_gbk driver.quit }}} - 检测登录,论坛登录例子 {{{ require 'rubygems' require 'selenium-webdriver' require 'iconv' class String def to_gbk Iconv.iconv("GBK//IGNORE","UTF-8//IGNORE",self).to_s end end driver = Selenium::WebDriver.for :ie driver.navigate.to "http://itbbs.pconline.com.cn/mobile/f587012.html" #sleep 3 #输入帐号密码 username = driver.find_element(:name, 'username') username.send_keys "3edc4rfv" password = driver.find_element(:name, 'password') password.send_keys "123456" password.submit #提交数据 #读取cookie查看是否登录成功 driver.manage.all_cookies.each { |cookie| puts "pass!" if cookie[:name] == "cmu" and cookie[:value] == "3edc4rfv" #puts "#{cookie[:name]} => #{cookie[:value]}" } #puts "pass!" if driver.manage.cookie["cmu"] == "3edc4rfv" driver.manage.delete_all_cookies #清除cookie #puts "#{driver.title}".to_gbk driver.quit }}} - 登录论坛是一个比较糟糕的例子 , 如果像这样写测试用例的话,依赖页面元素,这样对于经常修改的页面来说,测试用例的编辑就是一个灾难 {{{ #测试代码也需要重构,第一版重构 require 'rubygems' require 'selenium-webdriver' require 'iconv' class String def to_gbk Iconv.iconv("GBK//IGNORE","UTF-8//IGNORE",self).to_s end end #登录页面模型 class LoginPage attr_reader :url def initialize driver , url @driver = driver @url = url end def open @driver.navigate.to @url self end def login_as username , passpord @driver.find_element(:name, 'username').send_keys(username) @driver.find_element(:name, 'password').send_keys(passpord) @driver.find_element(:id => 'loginform').find_element(:tag_name => 'a').click end def logout @driver.find_element(:xpath => %Q{//div[@class='iptArea']//a[3]} ).click end def close @driver.close end end dr = Selenium::WebDriver.for :ie url = "http://itbbs.pconline.com.cn/mobile/f587012.html" page = LoginPage.new dr , url page.open page.login_as '3edc4rfv' , '123456' page.logout page.close }}}