ruby環境下selenium/webdriver可以通過selenium-webdriver.gem包進行安裝
gem install selenium-webdriver
支持語言及版本有ruby 1.8.7~1.9.2,jrbuy和rubinius
selenium-webdriver包含了selenium-client,在閱讀的時候,要注意它們兩個命名空間是在兩不同的API里:
1.Selenium::WebDriver - WebDrver API
2.Selenium::Client - Selenium RC API
WebDrver API是繼承自Selenium RC API,所以沒有必要在Selenium RC API花大量的時間,我們可以直接從Selenium::WebDriver開始,並圍繞兩個大類:Seleniu::WebDriver:Driver和Selenium::WebDriver::Element,這是整個WebDriver API的入口。
API 例子:
一個簡單的例子:
require "selenium-webdriver"
driver = Selenium::WebDriver.for :firefox
driver.navigate.to "http://www.google.com.hk"
element = driver.find_element(:name,'q')
element.send_keys "Hello WebDriver"
element.submit
puts driver.title
driver.quit
Driver 例子:
# 應用javascript
puts driver.execute_script("return window.location.pathname")
# 利用ruby和js獲取元素
element = driver.execut_script("return document.body")
driver.execut_script("return arguments[0].tagname", element) #=> "BODY"
# 等待一些特殊元素的出現
wait = Selenium::WebDriver::Wait.new(:timeout=>10) # seconds
wait.until{driver.find_element(:id,"foo")}
# 注:wait在new時,可以設置三個值,分別為:timeout(默認5秒),:message(默認nil),:interval(默認0.5)
# 選擇frame
driver.switch_to.frame "some-frame" # name或id
driver.switch_to.frame driver.find_element(:id, 'some-frame') # frame
# 注:switch_to方法不僅可以選擇frame,還可以處理window,alert,comfirmation等窗口
# 選擇回主窗口
driver.swith_to.default_content
Element 例子:
# 獲取元素屬性
class_name = element.attr
ibute("class")
# 判斷元素是否顯示
element.displayed?
# 獲取元素在頁面上的相對坐標位置
element.location
element.location.x
element.location.y
# 將元素滾動到視頻可以顯示的位置,再返回元素的相對坐標
element.location_once_scrolled_into_view
# 獲取元素的寬和高
element.size
# 在元素里輸入空,參看Selenium::WebDriver::Keys輸入值
element.send_keys :space
element.send_keys "tet", :arrow_left, "s" #=> "test", 先輸入 tet, 再輸入一次左方向鍵,再輸入s
element.send_keys [:control, 'a'], "1" #=> "1", 先輸入crtl+a,再輸入1
# 獲取元素文本
element.text
更高級的用法(見 ActionBuilder)
driver.action.key_down(:shift).click(element).double_click(second_element).key_up(:shift).drag_and_drop(element,third_element).perform
啟動chrome瀏覽器的方法
1.下載
ChromeDriver並運行,如圖


2.啟動chrome
driver = Selenium::WebDriver.for :remote, :url=>"http://localhost:9515"
driver.get "http://www.google.com.hk"
其它操作一樣。
如果這樣感覺比較麻煩,可以將下載的chromedriver.exe路徑加載到環境變量中,就可直接用了
driver = Selenium::WebDriver.for :chrome
chrome個性化啟動
profile = Selenium::WebDriver::Chrome::Profile.new
profile['download.prompt_for_download'] = false
profile['download.default_directory'] = "d:/download"
driver = Selenium::WebDriver.for :chrome, :profile=>profile
Remote應用
RomteWebDriver可以控制瀏覽器在不同的機器上運行,下載selenium-server-standlone-x.xx.x.jar
java -jar selenium-server-standalone.jar '啟動服務
driver = Selenium::WebDriver.for :remote
默認情況下,可以啟動服務運行在localhost:4444,並打開firefox。如果想連接其它機器上的服務,可以用:url選項
driver = Selenium::WebDriver.for :remote, :url=>"http://remoteserver:44444/wd/hub"
本機不用加/wd/hub,但遠程一定要加
啟動其它的瀏覽器,用:desired_capabilities選項
driver = Selenium::WebDriver.for :remote, :desired_capabilities=>:chrome
Selenium::WebDriver::Remote::Capabilities的例子
require "selenium-webdriver"
include Selenium
caps = WebDriver::Remote::Capabilities.htmlunit :javascript_enabled=>true
driver = WebDriver.for :remote, :desired_capalibities=>caps
修改remote服務的端口號,目前只支持firefox
include Selenium
caps = WebDriver::Remote::Capabilities.firefox (:proxy=>WebDriver::Proxy.new(:http=>"myproxyaddress:8888"))
driver = WebDriver.for :remote, :desired_capalibities=>caps
如果是一個遠程的remote服務
include Selenium
client = WebDriver::Remote::Http::Default.new
client.proxy = Proxy.new :http=>"proxy.org:8888"
driver = WebDriver.for :remote, :http_client=>client
Firefox
加擴展插件
在用firefox時,經常要用到firebug進行查看,啟動firefox帶firebug
include Selenium
profile = WebDriver::Firefox::Profile.new
profile.add_extension "path/firebug.xpi"
driver = WebDriver.for :firefox, :profile=>profile
使用已經存在的profile
使用一個已經存在的profile模板,可以用firefox -profilemanger把profile保存出來(這個命令在ff8上似乎無用,還要進一步驗證)
driver = Selenium::WebDriver.for :firefox, :profile=>"my_existing_profile"
如果想用默認profile,可以通過 :profile=>"default"
或者也可以這通過profile實例來使用已經存在的和自定義的profile。此方法不能修改已經存在的profile,且只能在webdriver下使用
default_profile = Selenium::WebDriver::Firdfox::Profile.from_name "default"
default_profile.native_events = true
driver = Selenium::WebDriver.for :firefox, :profile=>default_profile
導出firefox profile見
《Firefox 8導出profile文件》
Firefox個性化設置
端口號
profile = Selenium::WebDriver::Firefox::Profile.new
profile['browser.download.dir'] = 'd:\download'
profile['browser.download.folderlist'] = 2
profile['browser.helperApps.neverAsk.saveToDisk'] = "application/pdf"
driver = Selenium::WebDriver.for :firefox, :profile=>profile
用remote driver啟動時,任然可以對firefox進行個性化設置
profile = Selenium::WebDriver::Firfox::Profile.new
profile['foo.bar'] = true
capabilities = Selenium::WebDriver::Remote::Capabilities.firefox :firefox_profile=>profile
driver = Selenium::WebDriver.fox :remote, :desired_capabilities=>capabilities
設置Firefox路徑
當firfox不是安裝在默認路徑中時,要設定firefox的安裝路徑
Selenium::WebDriver::Firefox.path = "/path/to/firefox" # firefox安裝路徑
driver = Selenium::WebDriver.for :firefox
本地事件
本地事件在window下默認是激活的,可以設置關閉:
profile = Selenium::WebDriver::Firefox::Profile.new
profile.native_events = false # 關閉
driver = Selenium::WebDriver.for :firefox, :profile=>profile
理論上linux支持本地事件,profile.native_events = true # 開啟
Opera
opera也是用remote的方法進行啟動的。在開始之前,要下載selenium-server-standalone-x.xx.x.jar,並且新建環境變量SELENIUM_SERVER_JAR到本地系統中。
window: SELENIUM_SERVER_JAR=..\server-standalone.jar
liunx: export SELENIUM_SERVER_JAR=path_to/server-standalone.jar
便可以輕松的用Selenium::WebDriver啟動Opera
driver = Selenium::WebDriver.for :opera
driver.navigate.to "http://www.baidu.com"
Timeouts
隱式等待
WebDriver可以設置隱式等待,所以在應用#find_element定位元素時,會等待元素的出現,直至NoSuchElementError的出現。
driver = Selenium::WebDriver.for :firefox
driver.manager.timeouts.implicit_wait = 3 # 等待3秒
顯示等待
可以用wait類去實例化一些等待條件
wait = Selenium::WebDriver::Wait.new(:timeout=>3)
wait.until {driver.find_elenium(:id=>"foo").displayed?}
內部的超時
WebDriver使用了大量的HTTP的驅動(jsonWireProtocol)。Net::HTTP作為ruby的標准庫使用,默認超時為60秒。如果用WebDriver#get啟動一個加載時間超過60秒的頁面,你會看Net::HTTP的TimeoutError錯誤,可以在啟動瀏覽器之前修改timeout來改變默認超時時長。
client = Selenium::WebDriver::Remote::Http::Default.new
client.titmeout = 120 # 設置為120秒
driver = Selenium::WebDriver.for :temote, :http_client=>client
js彈出框
獲取js的alert,prompt和comfirm彈出窗都是用switch_to
require "selenium-webdriver"
driver = Selenium::WebDriver.for :firefox
driver.navigate.to "http://mysite.com/page_with_alert.html"
driver.find_element(:name, 'element_with_alert_javascript').click
a = driver.switch_to.alert
if a.text == 'A value you are looking for'
a.dismiss
else
a.accept
end
用Curb或者自己的http client
HTTP通信內部默認使用Net::HTTP,如果有安裝
Curb gem就可以選擇這么做
require "selenium/webdriver/remot/http/curb"
include Selenium
client = WebDriver::Remote::Http::Curb.new
driver = WebDriver.for :remote, :http_client=>client