selenium處理常見自動化場景


定位一組對象

webdriver使用find_element方法定位一個特定的對象,
定位一組元素的方法叫:find_elements。

定位一組對象一般用於以下場景:

  • 批量操作對象,比如將頁面上的checkbox都勾選上
  • 先獲取一組對象,再在這組對象中過濾需要具體定位的一些對象。

舉例:使用tag_name定位一組指定頁面上的checkbox

filepath='file:///'+ os.path.abspath('checkbox.html')
driver.get(filepath)
inputs=driver.find_elements_by_tag_name("input")
for input in inputs:
    if input.get_attribute('type')=='checkbox':
        input.click()

層級定位

在實際的項目測試中,經常會遇到無法直接定位到需要選取的元素,但是其父元素比較容易定位,通過定位父元素再遍歷其子元素選擇需要的目標元素,或者需要定位某個元素下所有的子元素。

層級定位的思想是先定位父對象,然后再從父對象中精確定位出其我們需要選取的后代元素。

driver.find_element_by_id('***').find_element_by_link_text('***')

定位frame中的對象

再web應用中經常會出現frame嵌套的應用,假設頁面上有A,B兩個frame,其中B在A內,那么定位B中的內容則需要先到A,再到B。

switch_to_frame方法可以把當前定位的主題切換到frame里,在frame里實際是嵌套了另外一個頁面,而webdriver每次只能在一個頁面識別,所以switch_to_frame方法去獲取frame中嵌套的頁面。

driver.switch_to.frame('frame 1')  #移動到id為frame 1的frame上
print driver.find_element_by_css_selector("#div1").text
   
driver.switch_to.default_content()  #將識別的主體切換出frame
print driver.find_element_by_css_selector("#id1").text

備注:
switch_to.frame的參數必須是id或者是name,所以一個frame只要有id和name處理起來很容易。如果沒有的話,兩種解決思路:
1、讓開發加上id或者name
2、使用xpath等方式定位然后實現跳轉

alert/confirm/prompt處理

具體思路是使用switch_to.alert()方法定位到當前的alert/confirm/prompt(這里注意當前頁面只能同時含有一個控件,如果多了會報錯的,所以這就需要處理了),然后在調用Alert的方法進行操作。
Alert提供了以下幾個方法:
text:返回alert/confirm/prompt中的內容
accept:點擊確認按鈕
dismiss:點擊取消按鈕
sendKeys:向Prompt中輸入文字

下拉框處理

1、下拉框通過元素定位識別

driver.find_element(By.XPATH,'//option[@value="mango"]').click()  
#以上元素為下拉框中的選項

2、創建一個select的對象,然后通過相應方法處理

selectElement=driver.find_element(By.XPATH,'//select[@id="Selector"]')
s=Select(selectElement)
s.select_by_index(2)  #索引定位,索引從0開始
time.sleep(2)
s.select_by_value("mango")  #value屬性值
time.sleep(2)
s.select_by_visible_text("桔子") #可見文本內容

調用javascript

當webdriver遇到無法完成的操作時候,這個時候可以使用javascript來完成,webdriver提供了execute_script()接口來調用js代碼。

執行js有兩種場景:
一種是在頁面上直接執行js
另一種是在某個已經定位的元素上執行js

driver.execute_script('alert("hello!!");')  #彈出窗口

driver.execute_script("arguments[0].style.border='5px solid red'",wl)  #加邊框

js="var user_input=document.getElementById('su').getAttribute('id');return user_input;"
driver.execute_script(js)  #識別並獲取對象屬性
driver.execute_script("document.body.scrollTop=10000;")  #瀏覽器滾動條滾動

js='arguments[0].removeAttribute("value");'  #移除元素的value屬性
js='arguments[0].setAttribute("value","newdream");'  #設置元素的value屬性
driver.execute_script(js.wl)

多窗口處理

有時候我們在測試一個web應用的時候會出現多個瀏覽器窗口的情況,
webdriver提供了相應的解決方案,如下:
首先要獲得每一個窗口的唯一表示符號(句柄),通過獲得的句柄來區分不同的窗口,從而對不同窗口的元素進行操作。

舉例:

current_handle=driver.current_window_handle  #獲得當前窗口的句柄
driver.find_element(By.LINK_TEXT,"另一個頁面").click()
time.sleep(3)
handle_list=driver.window_handles   #獲得所有窗口的句柄
for h in handle_list:
    if h!=current_handle:
        driver.switch_to.window(h)  #通過句柄跳轉窗口

# driver.close()  #關閉新打開的窗口

#回到前面的頁面
driver.switch_to.window(current_handle)

處理驗證碼

解決驗證碼的方法如下:
1、去掉驗證碼:在測試環境去掉,對於開發來說屏蔽相關驗證碼代碼
2、設置萬能碼:只要用戶輸入這個萬能碼,程序就認為驗證通過
3、驗證碼識別技術:可以通過python-tesseract來識別圖片驗證碼,python-tesseract是光學字符識別Tesseract OCR引擎的Python封裝類。不過不能達到100%識別

舉例:

from RIL import Image
from pytesseract import pytesseract
img=Image.open(r'c:\index.png')
a=pytesseract.image_to_string(img)
print a

4、記錄cookie:通過向瀏覽器添加cookie可以繞過登錄的驗證碼,在用戶登錄之前,通過add_cookie()方法將用戶名和密碼寫入cookie,使用該方法最大難點是如何獲取用戶名和密碼的cookie信息,可以通過get_cookies()或者詢問開發解決此問題。

處理cookie

假如我們需要驗證瀏覽器中是否存在cookie,因為基於真實的cookie是無法通過白盒和集成測試完成的,webdriver可以讀取、添加和刪除cookie信息webdirver操作cookie的方法如下:

  • get_cookies() 獲取所有cookie信息
  • get_cookie(name) 返回特定name有cookie信息
  • add_cookie(cookie_dict) 添加cookie,必須有name和value值
  • delete_cookie(name) 刪除特定部分的cookie信息
  • delete_all_cookie() 刪除所有cookie信息

舉例:

#獲取所有cookie並打印
driver.get("http://www.youdao.com")
for cookie in driver.get_cookies():
    print "%s -> %s"%(cookie['name'],cookie['value'])
#添加cookie舉例
driver.add_cookie({'name':'key-aaaaa','value':'value-bbbb'})
driver.delete_cookie("key-aaaaa")  #刪除cookie

cookie處理

利用cookie完成網站的免密碼應用
代碼思路:
第一階段
打開網站的登錄界面
獲取登錄之前的cookie
等待60s,這個時間手動去輸入用戶名、密碼、驗證碼登錄
獲取登錄之后的cookie
把登錄之后的cookie與登錄之前的cookie打印並進行對比
找出登錄之后不同的cookie或增加的cookie信息

第二階段:
新編寫一個腳本
打開網站的登錄頁面
用add_cookie()方式去逐項增加登錄之后不同的cookie
刷新網站,即可完成自動登錄操作

#第一階段代碼實例(禪道舉例):
driver.get("禪道地址")
cookies=driver.get_cookies()
for cookie in cookies:
    print(cookie)
time.sleep(60)  #暫停目的,做手工登錄操作
print("登錄之后的cookie")
cookies=driver.get_cookies()
for cookie in cookies:
    print(cookie)

#第二階段代碼實例(禪道舉例):
driver.get("禪道地址")
driver.add_cookie({'name':'sid','value':'ge1o36obij20g1fktssm7oeki2','domain':'192.168.4.160','path':'/'})
time.sleep(2)
driver.refresh()

備注:add_cookie()里面放置字典參數,cookie字典一般需要包含name、value、domain、path等字段,如果遇到cookie有Expirse字段,要去掉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM