UI自動化測試(1)
1、概述
webdrive之所以能夠操作瀏覽器,是因為他首先需要定位到被操作的元素屬性,然後就可以對瀏覽器做各種操作。定位到被操作的元素屬性的方法,以百度的輸入框為例:
2、元素定位的分類
2.1單個元素定位
標籤:
a標籤下的都是超連結
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()