Selenium中針對元素進行的動作在程式碼中可以分為兩類:
Selenium::WebDriver::ActionBuilder
類中的動作方法Selenium::WebDriver::Element
類中的動作方法
其中ActionBuilder
類中的動作方法比較豐富,基本涵蓋了所有可以進行的操作。
而Element
類的動作比較少,基本上只有點選和輸入等簡單的操作。
滑鼠操作
滑鼠點選
滑鼠單擊
driver.find_element(:link_text, 'Link1').click
複製程式碼
滑鼠雙擊
el = driver.find_element(id: "some_id")
driver.action.double_click(el).perform
複製程式碼
滑鼠右鍵
el = driver.find_element(id: "some_id")
driver.action.context_click(el).perform
複製程式碼
滑鼠拖放
把元素el1
拖到元素el2
上面
el1 = driver.find_element(id: "some_id1")
el2 = driver.find_element(id: "some_id2")
driver.action.drag_and_drop(el1, el2).perform
複製程式碼
還可以按照指定的與某個元素的相對位置來拖放
el = driver.find_element(id: "some_id1")
driver.action.drag_and_drop_by(el, 100, 100).perform
複製程式碼
#drag_and_drop_by(source, right_by, down_by)
方法有三個引數,source
是操作的物件元素,right_by
和down_by
是移動的控制引數,顧名思義表示向右和向下的偏移。
移動游標
Selenium中提供了兩個移動滑鼠游標的方法:
- 以當前游標位置為基準移動
driver.action.move_by(100, 100).perform
複製程式碼
move_by(right_by, down_by)
方法的兩個引數也是分別控制移動的偏移量。
- 以某個元素為基準移動
el = driver.find_element(id: "some_id")
driver.action.move_to(el).perform #移動到元素el上
driver.action.move_to(el, 100, 100).perform #移動到元素el的右下方(100,100)的位置
複製程式碼
鍵盤操作
鍵盤輸入
鍵盤上進行的最常用的操作就是輸入了。
Selenium中通過send_keys
方法來實現
el = driver.find_element(id: "some_id")
#在元素el中輸入help
driver.action.send_keys(el, "help").perform
複製程式碼
按住和釋放按鍵
有時候需要模擬按住鍵盤上的各種修飾鍵的操作,例如按照ctrl鍵和shift鍵的動作。
#按住CTRL鍵
driver.action.key_down(:control).perform
#釋放CTRL鍵
driver.action.key_up(:shift).perform
#在元素el上按住和釋放SHIFT鍵
el = driver.find_element(id: "some_id")
driver.action.key_down(el, :shift).perform
driver.action.key_up(el, :shift).perform
複製程式碼
Selenium中定義了鍵盤上所有按鍵,可以在Selenium::WebDriver::Keys
中查詢對應的名稱。
清空文字框
在頁面操作中有時候需要清空一個輸入框中已有的內容,這時候需要用到clear
方法。
el = driver.find_element(id: "some_id")
el.clear
複製程式碼
需要注意的是,這個操作僅限於在INPUT和TEXTAREA元素上操作,同時也可能無法達到期望的結果,這個時候可以利用鍵盤的操作CRTL+A(全選)之後再DELETE。
el = driver.find_element(id: "some_id")
el.send_keys([:control, 'a'],:backspace)
複製程式碼
視窗操作
處理彈窗
在頁面操作中時常要處理彈窗,Selenium中也提供了處理的方法。
alert = driver.switch_to.alert
alert.accept()
複製程式碼
切換視窗
在執行自動化測試的過程中,有可能會出現開啟了多個視窗的情況,這個時候需要在不同的視窗間切換。
driver = Selenium::WebDriver.for :chrome
driver.get 'http://test.com/windows'
driver.find_element(:id, 'new_window').click
#獲取當前所有window物件
windows_array = driver.window_handles
#切換到第一個window
driver.switch_to.window(windows_array.first)
複製程式碼
上傳檔案
上傳檔案是一個比較獨特的使用者與瀏覽器進行互動的場景,和之前的滑鼠鍵盤操作有很大的不同。
在Selenium中,主要是通過send_keys
方法向上傳檔案的入口元素輸入檔案路徑來實現的。這個操作有一個限制就是這個元素的型別必須是input。
driver = Selenium::WebDriver.for :chrome
filename = 'test.txt'
file_path = File.join(Dir.pwd, filename)
driver.get 'http://test.com/upload'
driver.find_element(:tagname, 'input').send_keys file_path
複製程式碼
下載檔案
下載檔案其實並不是由某種動作來實現的,因為介面上觸發下載的一般是一個按鈕,點選之後觸發下載。需要指令碼開發者配置的是瀏覽器對於下載行為的處理,一般是設定一個預設的下載路徑,同時設定自動下載不彈窗讓使用者確認。 下面就以Chrome和firefox上的瀏覽器配置為例介紹:
Chrome
DOWNLOAD_PATH = "path to store files"
prefs = {:download => {:prompt_for_download => false,
:default_directory => DOWNLOAD_PATH
},
}
prefs['profile.default_content_settings.multiple-automatic-downloads'] = 1
driver = Selenium::WebDriver.for :chrome, :prefs => prefs
複製程式碼
Firefox
profile = Selenium::WebDriver::Firefox::Profile.new
profile['browser.download.dir'] = DOWNLOAD_PATH
profile['browser.download.folderList'] = 2
profile['browser.helperApps.neverAsk.saveToDisk'] = 'images/jpeg, application/pdf, application/octet-stream'
profile['pdfjs.disabled'] = true
driver = Selenium::WebDriver.for :firefox, profile: profile
複製程式碼
這樣檔案就會自動下載到指定的路徑下。