Selenium實戰教程系列(三)--- Selenium中的動作

Batkid2018發表於2018-10-27

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_bydown_by是移動的控制引數,顧名思義表示向右和向下的偏移。

移動游標

Selenium中提供了兩個移動滑鼠游標的方法:

  1. 以當前游標位置為基準移動
driver.action.move_by(100, 100).perform
複製程式碼

move_by(right_by, down_by) 方法的兩個引數也是分別控制移動的偏移量。

  1. 以某個元素為基準移動
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
複製程式碼

這樣檔案就會自動下載到指定的路徑下。

相關文章