1. 程式人生 > >自動化-Selenium WebDriver相關技術點總結

自動化-Selenium WebDriver相關技術點總結

前端工具:FireBug&FirePath

setuptools是Python Enterprise Application Kit (PEAK)的一個副專案,它是Python的distutilsde工具的增強工具,可以讓程式設計師更方便的建立和釋出Python包,特別是那些對其他包有依賴性的狀況。

easy_install命令是由PEAK開發的setuptools包裡帶的一個簡易安裝命令,因此使用easy_install實際上是呼叫setuptools來完成安裝模組的工作。

pip是一個安裝和管理Python包的工具,通過pip來安裝Python包變得十分簡單;pip依賴於setuptools,所以在安裝pip之前需要安裝setuptools。目前Python3並不支援setuptools,因此需要使用distribute。

Selenium API:

定位方式:參考連結-> http://www.cnblogs.com/fnng/p/3183777.html
#通過id方式定位
browser.find_element_by_id("kw").send_keys("selenium”)

#通過name方式定位
browser.find_element_by_name("wd").send_keys("selenium”)

#通過tag name方式定位
browser.find_element_by_tag_name("input").send_keys("selenium")

#通過class name 方式定位
browser.find_element_by_class_name("s_ipt").send_keys("selenium") #通過CSS方式定位 1)通過id屬性來定位 browser.find_element_by_css_selector("#kw").send_keys("selenium”) 2)通過class屬性定位(點號表示通過class屬性來定位元素) browser.find_element_by_css_selector(“.s_ipt”) #通過xpath方式定位 browser.find_element_by_xpath("//input[@id='kw']").send_keys("selenium”)
browser.find_element_by_xpath(“html/body/div[30]/div/span").click() #通過partial link方式定位(通過部分文字資訊來定位) browser.find_element_by_partial_link_text(“文字連結").click() #使用邏輯運算子 browser.find_element_by_xpath(“//input[@id=‘kw’ and @class=‘su’]/span/input”) #使用By定位元素 find_element(By.ID,”kw”) find_element(By.CLASS_NAME,”s_ipt") ...等 瀏覽器視窗大小: browser.set_window_size(480800) self.driver.maximize_window()
控制瀏覽器後退、前進、重新整理:
# coding=utf-8
from selenium import webdriver

#使用火狐瀏覽器
# driver = webdriver.Firefox()
#使用谷歌瀏覽器executable_path後面跟著chromedriver本地下載路徑
driver = webdriver.Chrome(executable_path='/Users/maxdong/Downloads/chromedriver')

first_url= 'http://www.baidu.com'
driver.get(first_url)

second_url = 'http://news.baidu.com'
driver.get(second_url)
#返回百度首頁
driver.back()
#前進到新聞頁
driver.forward()
#重新整理
driver.refresh()

簡單元素操作:
self.driver.find_element_by_id("userId").clear()
self.driver.find_element_by_id("userId").send_keys(self.username)
self.driver.find_element_by_id("LoginBtn").click()
#提交輸入框內容
self.driver.find_element_by_id("query”).submit()
#停留幾秒
import time
time.sleep(3)
#計算元素個數
len()
#用於獲取列表中的一個元素(預設最後一個)並返回該元素的值
pop()
#把頁面上最後一個checkBox的勾選去掉
self.driver.find_element_by_css_selector(‘input[type=checkbox]’).pop.click()

滑鼠和鍵盤事件:

在使用 Selenium WebDriver 做自動化測試的時候,會經常模擬滑鼠和鍵盤的一些行為。比如使用滑鼠單擊、雙擊、右擊、拖拽等動作;或者鍵盤輸入、快捷鍵使用、組合鍵使用等模擬鍵盤的操作。在 WebDeriver 中,有一個專門的類來負責實現這些測試場景,那就是 Actions 類,在使用該類的過程中會配合使用到 Keys 列舉以及 Mouse、 Keyboard、CompositeAction 等類。
其次,在實際測試過程中,可能會遇到某些按鍵沒辦法使用 Actions、Keys 等類來實現的情況。 比如通過使用 Alt+PrtSc 組合鍵來實現擷取螢幕當前活動視窗的影象,在 Keys 列舉中,因為沒有枚舉出 PrtSc 鍵,所以沒辦法通過 Action 的 KeyDown(Keys) 來模擬按下這個動作。
再次是在自動化測試中,可能會遇到一些附件、檔案上傳的場景,或者是多檔案上傳,這些在 Selenium2.0 之後,可以直接使用 WebElement 類的 sendKeys() 方法來實現。

滑鼠點選操作:
滑鼠點選事件有以下幾種型別:

清單 1. 滑鼠左鍵點選
Actions action = new Actions(driver);action.click();// 滑鼠左鍵在當前停留的位置做單擊操作
action.click(driver.findElement(By.name(element)))// 滑鼠左鍵點選指定的元素

清單 2. 滑鼠右鍵點選
Actions action = new Actions(driver);
 action.contextClick();// 滑鼠右鍵在當前停留的位置做單擊操作
action.contextClick(driver.findElement(By.name(element)))// 滑鼠右鍵點選指定的元素

清單 3. 滑鼠雙擊操作
Actions action = new Actions(driver);
 action.doubleClick();// 滑鼠在當前停留的位置做雙擊操作
action.doubleClick(driver.findElement(By.name(element)))// 滑鼠雙擊指定的元素

清單 4. 滑鼠拖拽動作
Actions action = new Actions(driver);
// 滑鼠拖拽動作,將 source 元素拖放到 target 元素的位置。
 action.dragAndDrop(source,target);
// 滑鼠拖拽動作,將 source 元素拖放到 (xOffset, yOffset) 位置,其中 xOffset 為橫座標,yOffset 為縱座標。
action.dragAndDrop(source,xOffset,yOffset);

在這個拖拽的過程中,已經使用到了滑鼠的組合動作,首先是滑鼠點選並按住 (click-and-hold) source 元素,然後執行滑鼠移動動作 (mouse move),移動到 target 元素位置或者是 (xOffset, yOffset) 位置,再執行滑鼠的釋放動作 (mouse release)。所以上面的方法也可以拆分成以下的幾個執行動作來完成:

action.clickAndHold(source).moveToElement(target).perform();
action.release();

清單 5. 滑鼠懸停操作
Actions action = new Actions(driver);
action.clickAndHold();// 滑鼠懸停在當前位置,既點選並且不釋放
action.clickAndHold(onElement);// 滑鼠懸停在 onElement 元素的位置

action.clickAndHold(onElement) 這個方法實際上是執行了兩個動作,首先是滑鼠移動到元素 onElement,然後再 clickAndHold, 所以這個方法也可以寫成 action.moveToElement(onElement).clickAndHold()

清單 6. 滑鼠移動操作
Actions action = new Actions(driver);
 action.moveToElement(toElement);// 將滑鼠移到 toElement 元素中點
// 將滑鼠移到元素 toElement 的 (xOffset, yOffset) 位置,
//這裡的 (xOffset, yOffset) 是以元素 toElement 的左上角為 (0,0) 開始的 (x, y) 座標軸。
 action.moveToElement(toElement,xOffset,yOffset)
// 以滑鼠當前位置或者 (0,0) 為中心開始移動到 (xOffset, yOffset) 座標軸
 action.moveByOffset(xOffset,yOffset);

action.moveByOffset(xOffset,yOffset) 這裡需要注意,如果 xOffset 為負數,表示橫座標向左移動,yOffset 為負數表示縱座標向上移動。而且如果這兩個值大於當前螢幕的大小,滑鼠只能移到螢幕最邊界的位置同時丟擲 MoveTargetOutOfBoundsExecption 的異常。
滑鼠移動操作在測試環境中比較常用到的場景是需要獲取某元素的 flyover/tips,實際應用中很多 flyover 只有當滑鼠移動到這個元素之後才出現,所以這個時候通過執行 moveToElement(toElement) 操作,就能達到預期的效果。但是根據我個人的經驗,這個方法對於某些特定產品的圖示,影象之類的 flyover/tips 也不起作用,雖然在手動操作的時候移動滑鼠到這些圖示上面可以出現 flyover, 但是當使用 WebDriver 來模擬這一移動操作時,雖然方法成功執行了,但是 flyover 卻出不來。所以在實際應用中,還需要對具體的產品頁面做相應的處理。

清單 7. 滑鼠釋放操
Actions action = new Actions(driver);
action.release();// 釋放滑鼠

鍵盤事件:

對於鍵盤的模擬操作,Actions 類中有提供 keyUp(theKey)、keyDown(theKey)、sendKeys(keysToSend) 等方法來實現。鍵盤的操作有普通鍵盤和修飾鍵盤(Modifier Keys, 下面的章節將講到修飾鍵的概念)兩種 :

1.對於普通鍵盤,使用 sendKeys(keysToSend) 就可以實現,比如按鍵 TAB、Backspace 等。

清單 8. 普通鍵盤模擬 sendKeys(keysToSend)
Actions action = new Actions(driver);
action.sendKeys(Keys.TAB);// 模擬按下並釋放 TAB 鍵
action.sendKeys(Keys.SPACE);// 模擬按下並釋放空格鍵
/***
針對某個元素髮出某個鍵盤的按鍵操作,或者是輸入操作,
比如在 input 框中輸入某個字元也可以使用這個方法。這個方法也可以拆分成:
action.click(element).sendKeys(keysToSend)。
*/
action.sendKeys(element,keysToSend);

注意除了 Actions 類有 sendKeys(keysToSend)方法外,WebElement 類也有一個 sendKeys(keysToSend)方法,這兩個方法對於一般的輸入操作基本上相同,不同點在於以下幾點:
Actions 中的 sendKeys(keysToSend) 對於修飾鍵 (Modifier Keys) 的呼叫並不會釋放,也就是說當呼叫 actions.sendKeys(Keys.ALT); actions.sendKeys(Keys.CONTROL); action.sendKeys(Keys.SHIFT); 的時候,相當於呼叫 actions.keyDown(keysToSend),而如果在現實的應用中想要模擬按下並且釋放這些修飾鍵,應該再呼叫 action.sendKeys(keys.NULL) 來完成這個動作。
其次就是當 Actions 的 sendKeys(keysToSend) 執行完之後,焦點就不在當前元素了。所以我們可以使用 sendKeys(Keys.TAB) 來切換元素的焦點,從而達到選擇元素的作用,這個最常用到的場景就是在使用者名稱和密碼的輸入過程中。
第三點,在 WebDriver 中,我們可以使用 WebElement 類的 sendKeys(keysToSend) 來上傳附件,比如 element.sendKeys(“C:\test\uploadfile\test.jpg”); 這個操作將 test.jpg 上傳到伺服器,但是使用:

Actions action = New Actions(driver);
action.sendKeys(element,“C:\\test\\upload\\test.jpg”);
action.click(element).sendKeys(“C:\\test\\upload\\test.jpg”);

這種方式是上傳不成功的,雖然 WebDriver 在執行這條語句的時候不會出錯,但是實際上並沒有將檔案上傳。所以要上傳檔案,還是應該使用前面一種方式。

2.對於修飾鍵(Modifier keys),一般都是跟普通鍵組合使用的。比如 Ctrl+a、Alt+F4、 Shift+Ctrl+F 等等。
這裡先解釋一下修飾鍵的概念,修飾鍵是鍵盤上的一個或者一組特別的鍵,當它與一般按鍵同時使用的時候,用來臨時改變一般鍵盤的普通行為。對於單獨按下修飾鍵本身一般不會觸發任何鍵盤事件。在個人計算機上的鍵盤上,有以下幾個修飾鍵:Shift、Ctrl、Alt(Option)、AltGr、Windows logo、Command、FN(Function)。但是在 WebDriver 中,一般的修飾鍵指前面三個。你可以點選下面的 Wiki 連結去了解更多有關修飾鍵的資訊,Modifier key。
回到上面的話題,在 WebDriver 中對於修飾鍵的使用需要用到 KeyDown(theKey)、keyUp(theKey) 方法來操作。

清單 9. 修飾鍵方法 KeyDown(theKey)、keyUp(theKey)
Actions action = new Actions(driver);
action.keyDown(Keys.CONTROL);// 按下 Ctrl 鍵
action.keyDown(Keys.SHIFT);// 按下 Shift 鍵
action.keyDown(Key.ALT);// 按下 Alt 鍵
action.keyUp(Keys.CONTROL);// 釋放 Ctrl 鍵
action.keyUp(Keys.SHIFT);// 釋放 Shift 鍵
action.keyUp(Keys.ALT);// 釋放 Alt 鍵

所以要通過 Alt+F4 來關閉當前的活動視窗,可以通過下面語句來實現:action.keyDown(Keys.ALT).keyDown(Keys.F4).keyUp(Keys.ALT).perform();
而如果是對於像鍵盤上面的字母鍵 a,b,c,d… 等的組合使用,可以通過以下語句實現 :action.keyDown(Keys.CONTROL).sednKeys(“a”).perform();
在 WebDriver API 中,KeyDown(Keys theKey)、KeyUp(Keys theKey) 方法的引數只能是修飾鍵:Keys.SHIFT、Keys.ALT、Keys.CONTROL, 否者將丟擲 IllegalArgumentException 異常。 其次對於 action.keyDown(theKey) 方法的呼叫,如果沒有顯示的呼叫 action.keyUp(theKey) 或者 action.sendKeys(Keys.NULL) 來釋放的話,這個按鍵將一直保持按住狀態。

顯示等待和隱式等待:

顯示等待:使WebdDriver等待某個條件成立時繼續執行,否則在達到最大時長時丟擲超時異常。

element = WebDriverWait(driver, 5, 0.5).until(expected_conditions.presence_of_element_located(By.ID, "kw")))
element.send_keys('selenium’)

隱式等待:是通過一定的時長等待頁面上某元素載入完成。如果超出了設定的時長元素還沒被載入,則丟擲NoSuchElementEception異常。WebDriver提供了implicitly_wait()方法來實現隱式等待,預設設定為0.

element = WebDriverWait(driver, 5, 0.5).until(expected_conditions.presence_of_element_located(By.ID, "kw")))
element.send_keys('selenium’)

多表單切換:

通過switch_to.frame()方法將當前定位的主題切換為frame/iframe表單的內嵌頁面中。

driver.switch_to.frame(“if”)
#下面就可以正常進行元素操作了
…..

多視窗切換:

通過switch_to.window()方法,可以實現在不同的視窗之間切換.

警告框處理:

通過switch_to_alert()方法定位到alert/confirm/prompt,然後使用text/accept/dismisss/send_keys等方法進行操作

text:返回alert/confirm/prompt中的文字資訊
accept():接受現有警告框
dismiss():解散現有警告框
send_keys(keysToSend):傳送文字至警告框 keysToSend:講文字傳送至警告框。

#接收警告框
driver.switch_to_alert().accept()

檔案上傳、下載:

普通上傳:普通附件上傳是將本地檔案的路徑作為一個值放在input標籤中,通過form表單將這個值提交給伺服器。
外掛上傳:一般指基於Flash\JavaScript\Ajax等技術所實現的上傳功能
下載:需要通過FirefoxProfile()對其做一些設定:

browser.download.folderList  瀏覽器預設下載路徑
browser.download.manager.showWhenStarting 是否顯示開始
browser.download.dir 用於指定所下載檔案的目錄
browser.helperApps.neverAsk.saveToDisk 指定要下載頁面的Content-type值  ”application/octet-stream“為檔案的型別

1)send_keys實現上傳:
driver.find_element_by_name(“file”).send_keys(‘D:\upload_file_txt’)

2)Autolt上傳:
是一個使用類似BASIC指令碼語言的免費軟體,被設計用來進行Window GUI圖形介面自動化測試。
它利用模擬鍵盤按鍵,滑鼠移動和視窗、控制元件的組合來實現自動化任務。
Cookies/視窗截圖:
driver.get_cookies()
driver.get_screenshot_as_file(“D:\image\upload_ima.jpg”)

WebDriver原理:

WebDrive是按照server-client的經典設計模式來設計的。
Server就是Remote Server,可以是任意的瀏覽器。當我們的指令碼啟動瀏覽器後,該瀏覽器就是Remote Server,它的職責就是等待Client傳送請求並作出響應。
Client端簡單來說就是我們的測試程式碼。

WebDriver的工作流程:
1)WebDriver啟動目標瀏覽器,並繫結到指定埠。啟動的瀏覽器例項將作為WebDriver的Remote Server
2)Client端通過CommandExcuter傳送HTTPRequest給Remote Server的偵聽埠
3)Remote Server需要依賴原生的瀏覽器元件(chromedriver等)來轉化瀏覽器的native呼叫