Web 端的測試 Selenium 用法必備

軟體測試愛碼士發表於2019-03-04

大家都知道,基於Web端的測試的基礎框架是需要Selenium做主要支撐的,這裡邊給大家介紹下Web測試核心之基於 Python 的 Selenium

一、簡單介紹

Selenium 是用於測試 Web 應用程式使用者介面 (UI) 的常用框架。它是一款用於執行端到端功能測試的超強工具。您可以使用多個程式語言編寫測試,並且 Selenium 能夠在一個或多個瀏覽器中執行這些測試。

二、環境安裝

  1. 安裝 python,這個。。。忽略,建議 python2.7。

  2. 安裝基於 python 的 selenium 依賴包,命令:pip install selenium==2.53.6,你懂的。

  3. 安裝瀏覽器驅動包,推薦使用 chrome 瀏覽器的 chromedriver.exe,對應 chrome 版本一定要對哦,不然執行不起來的,安裝在哪?想放哪放哪,不過一般是放在 python 的根目錄下。下載地址:chromedriver.storage.googleapis.com/index.html

  4. 安裝 PyCharm 2.7 左右版本,這個無腦安裝~然後可自定義介面 UI 及編碼風格,這個。。。忽略

三、牛刀小試

1. 控制瀏覽器

#coding=utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window() #將瀏覽器最大化顯示
driver.set_window_size(480, 800) #設定瀏覽器寬480、高800顯示"
 driver.back() #後退
driver.forward() #前進
 driver.close() #關閉chrome
driver.quit() # 退出chrome
如果對軟體測試、介面測試、自動化測試、效能測試、LR指令碼開發、面試經驗交流。感興趣可以175317069,群內會有不定期的發放免費的資料連結,這些資料都是從各個技術網站蒐集、整理出來的,如果你有好的學習資料可以私聊發我,我會註明出處之後分享給大家。
複製程式碼

2. 物件的定位

  • 通過 id 定位:find_element_by_id()

  • 通過 name 定位:find_element_by_name()

  • 通過 class 定位:find_element_by_class_name()

  • 通過 tag 定位:find_element_by_tag_name()

  • 通過 link 定位:find_element_by_link_text()

  • 通過 partial_link 定位:find_element_by_partial_link_text()

  • 通過 xpath 定位:find_element_by_xpath()

  • 通過 css 定位:find_element_by_css_selector()

以上幾種定位是常規操作,應該就基本夠用了,但是有的時候就是會出現一些詭異的定位失效或者定位到了點選失效的問題,這個時候如果用js進行直接執行該事件,接下來介紹下非常規操作:

  • id 定位:document.getElementById()

  • name 定位:document.getElementsByName()

  • tag 定位:document.getElementsByTagName()

  • class 定位:document.getElementsByClassName()

  • css 定位:document.querySelectorAll()

   search_js = "document.getElementsByName(`wd`)[0].value=`selenium`;"# 通過name定位,然後賦值“selenium”
   search_js2 = "document.querySelectorAll(`.s_ipt`)[0].value=`selenium`;"# 通過css定位,然後賦值“selenium”
   button_js = "document.getElementById(`su`).click();"# 通過id定位,然後執行單擊操作
   button_js2 = "document.getElementsByClassName(`s_btn`)[0].click()"# 通過className定位,然後執行單擊操作 driver.execute_script(search_js2)#執行,execute_script(script, *args)
    
複製程式碼

以上幾種定位是可以再度升級,可以利用 jQuery 定位一波,這裡可參看之前總結的 JQ 選擇器中的思維導圖知識點(www.cnblogs.com/aoaoao/arti… JS,便忽略

3. 操作測試物件

#coding=utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://passport.kuaibo.com/login/")
driver.find_element_by_id("user_name").clear() #清除輸入框的預設內容
driver.find_element_by_id("user_name").send_keys("username")
driver.find_element_by_id("user_pwd").clear()
driver.find_element_by_id("user_pwd").send_keys("password") #輸入輸入框的內容為“password”
driver.find_element_by_id("dl_an_submit").click() #通過 submit() 來提交操作
driver.find_element_by_id("dl_an_submit").submit()
size=driver.find_element_by_id("kw").size #返回百度輸入框的寬高 text=driver.find_element_by_id("cp").text #返回百度頁面底部備案資訊
#返回元素的屬性值,可以是 id、name、type 或元素擁有的其它任意屬性
attribute=driver.find_element_by_id("kw").get_attribute(`type`) #返回元素的結果是否可見,返回結果為 True 或 False
result=driver.find_element_by_id("kw").is_displayed()
driver.quit() #退出
複製程式碼

4. 滑鼠鍵盤事件

from selenium import webdriver #引入 Keys 類包
from selenium.webdriver.common.keys import Keys #引入 ActionChains 類
from selenium.webdriver.common.action_chains import ActionChains
... #滑鼠事件 #定位到要操作的元素
right =driver.find_element_by_xpath("xx") #對定位到的元素執行滑鼠右鍵操作
ActionChains(driver).context_click(right).perform() #對定位到的元素執行滑鼠雙擊操作
ActionChains(driver).double_click(right).perform() #對定位到的元素執行滑鼠移動到上面的操作
ActionChains(driver).move_to_element(right).perform() #對定位到的元素執行滑鼠左鍵按下的操作
ActionChains(driver).click_and_hold(right).perform() #定位元素的原位置
element = driver.find_element_by_name("xxx") #定位元素要移動到的目標位置
target = driver.find_element_by_name("xxx") #執行元素的移動操作
ActionChains(driver).drag_and_drop(element, target).perform() #鍵盤事件 #刪除多輸入的一個 值
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE) #輸入空格鍵+“教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys(u"教程") #ctrl+x 剪下輸入框內容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,`x`) #其餘的鍵盤操作類似
複製程式碼

5. 等待時間


#coding=utf-8
from selenium import webdriver #匯入 WebDriverWait 包
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC #匯入 time 包
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com") #WebDriverWait()方法使用,顯示等待,WebDriverWait(driver,超時時長,呼叫頻率,忽略異常).until(可執行方法,超時返回的資訊),這裡可以呼叫EC來實現可執行方法
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id(“kw”).is_displayed()) #until(method, message=’ ’),呼叫該方法提供的驅動程式作為一個引數,直到返回值不為 False
element.send_keys("selenium") #新增智慧等待,隱時等待
driver.implicitly_wait(30)
driver.find_element_by_id("su").click() #新增固定休眠時間,強制等待
time.sleep(5)
driver.quit()
複製程式碼

6. 組物件定位及層級定位,呃,忽略

7. 多視窗處理

#coding=utf-8
from selenium import webdriver import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com/") #獲得當前視窗
nowhandle=driver.current_window_handle #開啟註冊新視窗
driver.find_element_by_name("tj_reg").click()
allhandles=driver.window_handles #迴圈判斷視窗是否為當前視窗
for handle in allhandles: if handle != nowhandle:
        driver.switch_to_window(handle) print `now register window!`
#切換到郵箱註冊標籤
driver.find_element_by_id("mailRegTab").click()
time.sleep(5)
driver.close() #回到原先的視窗
driver.switch_to_window(nowhandle)
driver.find_element_by_id("kw").send_keys(u"註冊成功!")
time.sleep(3) #ifrome處理 #這裡會自動識別id,name,如果沒有則可以將元素通過選擇器找到,然後輸入該元素即可
driver.switch_to_frame("f1")
element = driver.find_element_by_id("kw")
driver.switch_to_frame(element)
driver.quit() 
複製程式碼

8. 提示視窗處理

#coding=utf-8
from selenium import webdriver import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com/") #點選開啟搜尋設定
driver.find_element_by_name("tj_setting").click()
driver.find_element_by_id("SL_1").click() #點選儲存設定
driver.find_element_by_xpath("//div[@id=`gxszButton`]/input").click() #獲取網頁上的警告資訊
alert=driver.switch_to_alert() #接收警告資訊
alert.accept() #取消對話方塊(如果有的話)
alert.dismiss() #輸入值(如果有的話)
alert.send_keys(“xxx”)
複製程式碼

9. 控制瀏覽器滾動條,這個運用之前提示的jq語句即可實現

10. cookie處理,主要用途在於處理驗證碼問題

#coding=utf-8
from selenium import webdriver import time
driver = webdriver.Chrome()
driver.get("http://www.youdao.com") #向 cookie 的 name 和 value 新增會話資訊。
driver.add_cookie({`name`:`key-aaaaaaa`, `value`:`value-bbbb`}) #遍歷 cookies 中的 name 和 value 資訊列印,當然還有上面新增的資訊
for cookie in driver.get_cookies(): print "%s -> %s" % (cookie[`name`], cookie[`value`]) ##### 下面可以通過兩種方式刪除 cookie ##### # 刪除一個特定的 cookie
driver.delete_cookie("CookieName") # 刪除所有 cookie
driver.delete_all_cookies()
time.sleep(2)
driver.close()
複製程式碼

四、小結

如果對軟體測試、介面測試、自動化測試、效能測試、LR指令碼開發、面試經驗交流。感興趣可以175317069,群內會有不定期的發放免費的資料連結,這些資料都是從各個技術網站蒐集、整理出來的,如果你有好的學習資料可以私聊發我,我會註明出處之後分享給大家。

在熟悉了selenium常見的API基本操作後,這裡便可以開展實際測試用例的設計了,一個良好的自動化測試用例起碼符合一下五個條件:

1、一個指令碼是一個完整的場景,從使用者登陸操作到使用者退出系統關閉瀏覽器。

2、一個指令碼指令碼只驗證一個功能點,不要試圖使用者登陸系統後把所有的功能都進行驗證再退出系統

3、儘量只做功能中正向邏輯的驗證,不要考慮太多逆向邏輯的驗證,逆向邏輯的情況很多(例如手 號輸錯有很多種情況),驗證一方面比較複雜,需要編寫大量的指令碼,另一方面自動化指令碼本身比較脆弱, 很多非正常的邏輯的驗證能力不強。(我們儘量遵循使用者正常使用原則編寫指令碼即可)

4、指令碼之間不要產生關聯性,也就是說編寫的每一個指令碼都是獨立的,不能依賴或影響其他指令碼。

5、如果對資料進行了修改,需要對資料進行還原。
6、在整個指令碼中只對驗證點進行驗證,不要對整個指令碼每一步都做驗證。

最後配合unittest或者testNG單元測試框架,實現分層、資料驅動、斷言、截圖、日誌等全方位功能,得心應手的開展自動化測試工作。

相關文章