基於Python的Selenium經驗總結

你們都知道,基於Web端的測試的基礎框架是須要Selenium作主要支撐的,這裏邊給你們介紹下Web測試核心之基於Python的Seleniumcss

1、簡單介紹

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

2、環境安裝

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

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

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

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

3、牛刀小試

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

2. 對象的定位api

1.經過id定位:find_element_by_id()瀏覽器

2.經過name定位:find_element_by_name()cookie

3.經過class定位:find_element_by_class_name()

4.經過tag定位:find_element_by_tag_name()

5.經過link定位:find_element_by_link_text()

6.經過partial_link定位:find_element_by_partial_link_text()

7.經過xpath定位:find_element_by_xpath()

8.經過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選擇器中的思惟導圖知識點(https://www.cnblogs.com/aoaoao/articles/9708860.html)來實現,這裏基本相似於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()

4、小結

若是對軟件測試、接口測試、自動化測試、性能測試、LR腳本開發、面試經驗交流。感興趣能夠175317069,羣內會有不按期的發放免費的資料連接,這些資料都是從各個技術網站蒐集、整理出來的,若是你有好的學習資料能夠私聊發我,我會註明出處以後分享給你們。

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

一、一個腳本是一個完整的場景,從用戶登錄操做到用戶退出系統關閉瀏覽器。

二、一個腳本腳本只驗證一個功能點,不要試圖用戶登錄系統後把全部的功能都進行驗證再退出系統

三、儘可能只作功能中正向邏輯的驗證,不要考慮太多逆向邏輯的驗證,逆向邏輯的狀況不少(例如手 號輸錯有不少種狀況),驗證一方面比較複雜,須要編寫大量的腳本,另外一方面自動化腳本自己比較脆弱, 不少非正常的邏輯的驗證能力不強。(咱們儘可能遵循用戶正常使用原則編寫腳本便可)

四、腳本之間不要產生關聯性,也就是說編寫的每個腳本都是獨立的,不能依賴或影響其餘腳本。

五、若是對數據進行了修改,須要對數據進行還原。
六、在整個腳本中只對驗證點進行驗證,不要對整個腳本每一步都作驗證。

最後配合unittest或者testNG單元測試框架,實現分層、數據驅動、斷言、截圖、日誌等全方位功能,駕輕就熟的開展自動化測試工做。

出處:https://blog.csdn.net/Stephen_shijun/article/details/83992279

相關文章
相關標籤/搜索