Python之Selenium
一、Selenium
Selenium是非常優秀的WEB(UI)自動化測試框架,最小的版本是Selenium4.x。Selenium支援主流的瀏覽器自動化測試,具體是Chrome,IE,Firefox等瀏覽器,Selenium也是支援主流的開發語言,如Python,Java,Net,PHP
Selenium=WebDriver+Selenium
二、環境搭建
1、安裝Selenium的庫,pip3 install selenium
2、安裝Chrome瀏覽器
3、安裝Chrome瀏覽器的驅動
A、檢視Chrome瀏覽器版本
B、到淘寶源下載與瀏覽器版本匹配的Driver
C、下載成功後進行解壓,並且以管理員身份執行
B、把這個driver放到Python的安裝目錄下
三、元素定位
webdriver之所以能夠操作瀏覽器,是因為它首先需要定位到被操作的元素屬性,然後就可以對瀏覽器做各種操作
1、單個元素定位
2、多個元素定位,指的是元素的屬性都一致,返回的時列表,可以根據列表的索引來定位元素屬性
3、不管是單個元素定位還是多個元素定位,目前有8種,分別為:
LINK_TEXT = "link text" #超連結
TAG_NAME = "tag name"
CSS_SELECTOR = "css selector"
簡易操作步驟舉例:
from selenium import webdriver #從selenium中匯入webdriver。 import time #匯入時間的庫 driver=webdriver.Chrome() #對Chrome進行例項化處理 driver.get("http://www.baidu.com") #導航到百度 time.sleep(4) #休眠4s driver.quit() #退出瀏覽器
1、ID = "id" #ID不能是唯一的
from selenium import webdriver import time # id元素屬性 driver=webdriver.Chrome() driver.get("http://www.baidu.com") # send_keys()——輸入的意思 driver.find_element_by_id("kw").send_keys("美食 圖片") time.sleep(5) driver.quit()
2、NAME = "name"
# name的元素屬性 driver=webdriver.Chrome() driver.get("http://www.baidu.com") driver.find_element_by_name("wd").send_keys("美食 圖片") time.sleep(5) driver.quit()
3、CLASS_NAME = "class name"
查詢class後的內容
# class_name元素屬性 driver=webdriver.Chrome() driver.get("http://www.baidu.com") driver.find_element_by_class_name("s_ipt").send_keys("美食 圖片") time.sleep(4) driver.quit()
4、XPATH = "xpath"
xpath和full xpath區別
當ID為動態引數時,因為每次返回的值不同建議使用full xpath全路徑
當使用id,name,class_name都定位不到時,就需要考慮使用css或xpath
使用xpath資訊時,需要點選input前的三個點,左鍵選擇copy,可以切換xpath,full xpath和selector
# xpath元素屬性 from selenium import webdriver import time driver=webdriver.Chrome() driver.get("http://www.baidu.com") driver.find_element_by_xpath('//*[@id="kw"]').send_keys('美食 圖片') time.sleep(3) driver.quit()
# full xpath元素屬性 driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input').send_keys('美食 圖片')
5、CSS_SELECTOR = "css selector"
css和xpath區別
css選擇是依據頁面的資料樣式定位的,有標籤選擇,類選擇,id選擇,,或者他們的交併
集, 除此之外沒有其他的輔助元素了
兩種定位方式功能基本一致,但是xpath明顯更強大,只是xpath寫起來較複雜,css寫起來容易些
# css元素屬性
driver=webdriver.Chrome() driver.get("http://www.baidu.com") driver.find_element_by_css_selector('#kw').send_keys("美食 圖片") time.sleep(3) driver.quit()
6、
from selenium import webdriver import time driver=webdriver.Chrome() driver.get("http://www.baidu.com") # click()——點選的意思 # 超連結 driver.find_element_by_link_text('新聞').click() #partial link text driver.find_element_by_partial_link_text('新').click() time.sleep(3) driver.quit()
7、TAG_NAME = "tag name"
# tagName元素屬性 driver=webdriver.Chrome() driver.get("http://www.baidu.com") # tags=driver.find_element_by_tag_name("input").send_keys("美食 圖片") tags=driver.find_elements_by_tag_name("input") # print(type(tags)) # for item in tags: # print(item) tags[7].send_keys("美食 圖片") time.sleep(8) driver.quit()
實戰
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("9615") driver.find_element_by_id("freepassword").send_keys("123456") time.sleep(3) driver.find_element_by_link_text("登入").click()
time.sleep(3)
driver.quit()
四、UI自動化常用操作
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()
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、獲取當前測試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()
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()
5、多視窗解決思路
解決步驟:
5.1、先開啟當前頁面
5.2、獲取當前頁面放在一個變數中
5.3、開啟新的頁面
5.4、獲取所有頁面並放在一個變數中
5.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()
6、清空——clear()
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()
7、獲取元素屬性的值
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()