1. 程式人生 > 其它 >UI自動化測試(1)

UI自動化測試(1)

1、概述

webdrive之所以能夠操作瀏覽器,是因為他首先需要定位到被操作的元素屬性,然後就可以對瀏覽器做各種操作。定位到被操作的元素屬性的方法,以百度的輸入框為例:

 2、元素定位的分類

2.1單個元素定位

標籤:

a標籤下的都是超連結

input標籤下的都是輸入框

詳細內容可以參考下方部落格園的內容:https://w.cnblogs.com/astar/archive/2010/03/01/1675967.html

2.1.1一般定位元素屬性

2.2.1.1id

from selenium import webdriver
import time
#單個元素定位:
#1、常用元素屬性定位:
#通過id元素屬性定位
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
#find_element_by_id("kw")是通過id元素定位的關鍵字,send_keys("趙麗穎")是輸入的關鍵字。
driver.find_element_by_id("kw").send_keys("趙麗穎")
time.sleep(5)
#退出瀏覽器,且關閉程式。
driver.quit()

2.2.1.2name

from selenium import webdriver
import time
#通過name元素屬性定位
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
#find_element_by_name("wd")是通過name元素定位的關鍵字,send_keys("馮紹峰")是輸入的關鍵字。
driver.find_element_by_name("wd").send_keys("馮紹峰")
time.sleep(3)
driver.quit()

2.2.1.3class_name

from selenium import webdriver
import time
#通過class_name元素屬性定位
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
#find_element_by_class_name("s_ipt")是通過class_name元素定位的關鍵字,send_keys("趙麗穎")是輸入的關鍵字。
driver.find_element_by_class_name("s_ipt").send_keys("趙麗穎")
time.sleep(3)
driver.quit()

2.1.2超連結元素定位屬性

2.2.2.1link_text

from selenium import webdriver
import time
#2、處理超連結的元素屬性:
#通過link text元素屬性處理
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
#find_element_by_link_text("新聞")是通過link text元素處理超連結,click()是點選的意思。
driver.find_element_by_link_text("新聞").click()
time.sleep(3)
driver.quit()

2.2.2.2partial link text

from selenium import webdriver
import time
#通過partial link text元素屬性處理
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
#find_element_by_partial_link_text("聞")是通過partial link text元素模糊處理超連結,click()是點選的意思。
driver.find_element_by_partial_link_text("聞").click()
time.sleep(3)
driver.quit()

2.2.3追加定位元素屬性

當使用id、name、class_name都定位不到的時候,我們就是用css_selector和xpath,我習慣於把他們稱為追加元素定位屬性。

2.2.3.1xpath

from selenium import webdriver
import time
#3、當使用id、name、class_name都定位不到的時候,我們就是用css_selector和xpath。
#通過xpath元素屬性定位
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
#find_element_by_xpath('//*[@id="kw"]')是通過xpath元素定位的關鍵字,send_keys("趙麗穎")是輸入的關鍵字。
driver.find_element_by_xpath('//*[@id="kw"]').send_keys("趙麗穎")
time.sleep(3)
driver.quit()

2.2.3.2css selector

from selenium import webdriver
import time
#通過css元素屬性定位
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
#find_element_by_css_selector('#kw')是通過css元素定位的關鍵字,send_keys("楊紫")是輸入的關鍵字。
driver.find_element_by_css_selector('#kw').send_keys("楊紫")
time.sleep(3)
driver.quit()

2.2.3.2xpath和css的區別

1)css:是依據頁面的資料樣式定位的, 有標籤選擇、類選擇、id選擇,或者他們的交併集,除此之外沒有其他的輔助元素了 。xpath :是路徑表示式,所有元素和內容都可以成為路徑的一部分。兩種定位方式功能基本一致,但是xpath明顯更強大,只是xpath寫起來較複雜,css寫起來容易些。

(2)css表示式更簡潔;

(3)css在chrom、火狐查詢速度快一些,效率高一些,xpath在IE瀏覽器相對快一些(ie瀏覽器無論是css,xpath都比谷歌、火狐要慢)

(4)CSS不支援文字搜尋,XPATH支援文字搜尋text()

(5)xpath支援的函式特別多,CSS選擇器支援的函式比較少,所以在複雜元素查詢時候,xpath反而更加簡潔,所以xpath功能更加強悍。

那麼什麼時候用css,什麼時候xpath呢?當查詢元素比較簡單,用css沒錯,如果複雜,用xpath比較好。

2.2.4tag_name元素定位方法

from selenium import webdriver
import time
#tag_name元素屬性定位和多元素定位:
#通過tag_name元素屬性定位,tag_name獲取到的是標籤,當獲取的標籤有很多個時,就需要使用多個元素定位的方法。
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
#driver.find_elements_by_tag_name("input")  #是通過tag_name元素定位的方法,由於input標籤有很多,所以需要使用多個元素定位的方法。
list1=driver.find_elements_by_tag_name("input")     
list1[7].send_keys("馮紹峰")    #根據列表的索引來定位元素屬性。
time.sleep(3)
driver.quit()

2.3多個元素定位

多個元素定位,指的是元素的屬性都一致,返回的是列表,可以根據列表的索引來定位元素屬性。不管是單個元素定位還是多個元素定位,目前都有8種。

2.4實戰

from selenium import webdriver
import time
#實戰:以新浪郵箱登入為例:
#通過id元素屬性定位:
driver=webdriver.Chrome()
driver.get("https://mail.sina.com.cn/")
driver.find_element_by_id("freename").send_keys("13762237226")
driver.find_element_by_id("freepassword").send_keys("123456")
time.sleep(3)
driver.find_element_by_link_text("登入").click()
time.sleep(3)
driver.quit()

3、UI自動化常用操作

3.1獲取當前測試地址

assert:是python原生的斷言方法。

如:a==1 b==1 c==2

那麼assert a=b是不會出錯的。那麼assert a=c是會出現asserterror的錯誤。

from selenium import webdriver
import time
#獲取當前測試地址:
driver=webdriver.Chrome()
driver.get("https://mail.sina.com.cn/")
#current_url獲取當前被測試WEB的地址
print(driver.current_url)
#assert:是python原生的斷言方法。
assert driver.current_url.endswith("sina.com.cn/")
time.sleep(3)
driver.quit()

3.2獲取當前頁面程式碼

from selenium import webdriver
import time
#獲取當前頁面程式碼
driver=webdriver.Chrome()
driver.get("https://mail.sina.com.cn/")
#page_source:獲取當前頁面的程式碼。
print(driver.page_source)
driver.quit()

3.3獲取當前測試WEB的title

from selenium import webdriver
import time
#獲取WEB的title
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.title
print(driver.title)
assert driver.title=="百度一下,你就知道"
driver.quit()

3.4頁面的前進與後退

from selenium import webdriver
import time
#頁面的前進與後退
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
print(driver.current_url)
time.sleep(2)
driver.get("https://mail.sina.com.cn/")
print(driver.current_url)
time.sleep(2)
#頁面後退
driver.back()
print(driver.current_url)
time.sleep(2)
#頁面前進
driver.forward()
print(driver.current_url)
time.sleep(2)
driver.title
print(driver.title)
driver.quit()

3.5瀏覽器頁面最大化

from selenium import webdriver
import time
#瀏覽器頁面的最大化
driver=webdriver.Chrome()
driver.get("https://mail.sina.com.cn/")
#maximize_window():瀏覽器頁面最大化
driver.maximize_window()

3.6多視窗解決思路

解決步驟:

(1)先開啟當前頁面;

(2)然後獲取當前頁面放在一個變數中;

(3)開啟新的頁面;

(4)獲取所有頁面並且放在一個變數中;

(5)迴圈所有頁面,判斷如果不是當前頁面,那麼就是在新的頁面。

from selenium import webdriver
import time
#多視窗解決思路,以新浪郵箱為例:
driver=webdriver.Chrome()
driver.get("https://mail.sina.com.cn/")
#瀏覽器頁面最大化
driver.maximize_window()
#獲取當前頁面放在一個變數中,current_window_handle:獲取當前頁面。
nowHandle=driver.current_window_handle
time.sleep(3)
#開啟新的頁面
driver.find_element_by_link_text("註冊").click()
time.sleep(2)
#獲取所有頁面並且放在一個變數中,window_handles:獲取所有頁面。
allHandle=driver.window_handles
time.sleep(1)
#迴圈所有頁面
for handle in allHandle:
#判斷如果不是當前頁面,那麼就是在新的頁面。
	if handle!=nowHandle:
		#從當前頁面切換到新的頁面
		driver.switch_to.window(handle)
		driver.find_element_by_name("email").send_keys("asd123")
		time.sleep(2)
		#關閉新的頁面,但是不關閉程式。
		driver.close()
#從新的頁面切換到原來的頁面
driver.switch_to.window(nowHandle)
time.sleep(1)
driver.find_element_by_id("freename").send_keys("qy12345")
time.sleep(2)
driver.quit()

3.7清空

from selenium import webdriver
import time
#clear():清空
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
so=driver.find_element_by_id("kw")
so.send_keys("趙麗穎")
time.sleep(2)
so.clear()
time.sleep(2)
driver.quit()

3.8獲取元素屬性的值

from selenium import webdriver
import time
#get_attribute()的方法是獲取元素屬性的值
driver=webdriver.Chrome()
driver.maximize_window()
driver.get("http://www.baidu.com")
time.sleep(2)
so=driver.find_element_by_id("kw")
time.sleep(1)
so.send_keys("趙麗穎")
#我們在輸入框中輸入的值都是鍵值中的value。
print(so.get_attribute("value"))
time.sleep(3)
driver.quit()