selenium rc和webdriver

Aug 17, 2011

前两天在跟结对的同事查看一段我之前写的自动化搭建初始数据的代码时,同事问我为什么需要起一个selenium server才能跑起来,而我们的本地跑的cucumber测试却没有需要你显示的跑一个selenium server.我一时其实也回答不上来,下班后仔细查了查selenium的文档,才豁然开朗.我之前用的是selenium-client, 因为我之前想用它来截取每个浏览器的屏幕, 而selenium-client提供了很好API来跟浏览器打交道(甚至内置的截图方法),  它是基于Selenium RC的.讲到这个先简要介绍一下selenium,它主要用来驱动和跟浏览器做交互,实现web应用程序的自动化测试. 所以意味着selenium必须有一套自己跟浏览器交互的API. selenium根据实现形式的不同分为两种: selenium rc 和 webdriver.

Selenium RC

selenium rc 是比较早提出来的, 它的大概流程是这样:  selenium rc客户端先跟服务器端建立联系, 然后服务器端启动一个浏览器,将主要selenium核心的javascript注入到浏览器中. 然后客户端将不同语言编写的代码 比如在selenium-client ruby代码是这样
    require "rubygems"
    gem "selenium-client", "~=1.2.16"
    require "selenium/client"
    begin
      @browser = Selenium::Client::Driver.new 
          :host => "localhost",
          :port => 4444,
          :browser => "*firefox",
          :url => "http://www.google.com",
          :timeout_in_second => 60

      @browser.start_new_browser_session
        @browser.open "/"
        @browser.type "q", "Selenium seleniumhq.org"
        @browser.click "btnG", :wait_for => :page
        puts @browser.text?("seleniumhq.org")
    ensure
      @browser.close_current_browser_session
    end
转换为一种中间的指令Selenese,然后发给服务器端,服务器在浏览器中请求对应的URL,拿到页面后,再将Selenese转换成对应的javascript指令注射到浏览器当前页面中并执行,最后在关闭浏览器. 所以selenium RC是使用javascript来跟浏览器进行交互的.

Selenium Webdriver

selenium webdriver采取的一条不同方式,它不是使用javascript来跟浏览器打交道, 而是实现了跟每一个不同浏览器特定相关的原生API来跟浏览器打交道.所以意味着它正对某种浏览器,都有一个对应的driver. 好处在于它绕过了selenium rc使用javascript跟浏览器交互的一些弊病,比如same origin. 同时Selenium Webdriver旨在提供一套更加面向对象方式的API.因为它使用每个浏览器原生API来打交道,所以一方面它比selenium rc会更快更稳定,同时就意味着我们可以这么说"如果你使用的是selenium webdriver的话,你就可以直接抛弃selenium server." 因为你根本不需要启动一个服务器来处理跟浏览器交互.
require 'rubygems'
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.get "http://google.com"

element = driver.find_element :name => "q"
element.send_keys "Selenium seleniumhq.org"
element.submit

puts "Page title is #{driver.title}"

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until { driver.title.downcase.start_with? "Selenium seleniumhq.org" }
puts "Page title is #{driver.title}"
driver.quit
之前提到每个浏览器都得有自己对应的driver,现在目前有支持:FirefoxDriver, ChromeDriver, IEDriver和OperaDriver,甚至有IPhoneDriver. 但是相对selenium rc, webdriver它对alert/confirm框的支持还不是很好. Capybara的selenium使用的是哪一种了 selenium RC 或 Webdriver? 你可以从Capybara的github wiki说明上找到:   At the moment, Capybara supports Selenium 2.0 (Webdriver), not Selenium RC. 在capybara中,你可以注册不同浏览器对应的driver:
 Capybara.register_driver :selenium do |app|
   Capybara::Selenium::Driver.new(app, :browser => :chrome) 
 end

Ruby Bindings

selenium webdriver 提供了非常好的ruby支持,可以参考Selenium-webdriver Ruby.

References

For more information, pls refer to site docs: http://seleniumhq.org/docs/ Official Blog:http://seleniumhq.wordpress.com/