定位一組對象
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字段,要去掉