一.自動化測試
-
定義:可以理解為通過一定的技術手段,操作機器來得到人的模擬操作
-
目的:&意義:隨着產品的完善,需要回顧驗證的測試點越來越多,這個時候我們可以通過自動化測試的技術的手段,把需要回歸的測試點中,可以使用自動化測試實現的部分實現,那么這樣,我們需要回歸測試的點就會減少,已實現的部分可以一勞永逸。
-
分類:
-
UI自動化測試:(前端自動化測試)--->selenium(工具&框架&庫)
-
API自動化測試
-
單元自動化測試
-
二.UI自動化測試
-
環境搭建
-
安裝selenium第三方庫:pip3 install selenium
-
安裝Chrome瀏覽器
-
下載瀏覽器對應的驅動,然后把Chromedriver放在python的安裝目錄下
-
查看瀏覽器的版本(設置--->關於chrome--->版本號)
-
-
-
-
-
到http://npm.taobao.org/mirrors/chromedriver/下載對應版本的驅動
-
-
-
-
-
下載后解壓到python的目錄下,然后以管理員身份運行,控制台跳出以下代碼表示安裝成功
Only local connections are allowed. Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe. ChromeDriver was started successfully.
-
-
-
查看selenium版本
-
查看元素定位方法
-
-
查看方法
-
-
-
結果
-
-
單個元素定位方法的的使用
-
-
id定位方法
- 查看id
-
-
-
- 通過代碼實現自動化測試:
from selenium import webdriver import time as t #導入庫 driver=webdriver.Chrome() #指定被測的瀏覽器並且對webdriver進行實例化 driver.get("http://www.baidu.com/") #導航到被測網址 t.sleep(2) #停留2秒 driver.find_element_by_id("kw").send_keys("python") #按照頁面屬性id定位到輸入框並輸入“python” driver.find_element_by_id("su").click() #按照頁面屬性id定位到百度一下並點擊 t.sleep(3) #停留5秒 driver.quit() #退出
- 通過代碼實現自動化測試:
-
name定位方法
- 查看name方法同上
- 代碼
from selenium import webdriver import time as t #導入庫 driver=webdriver.Chrome() #指定被測的瀏覽器並且對webdriver進行實例化 driver.get("http://www.baidu.com/") #導航到被測網址 t.sleep(2) #停留2秒 driver.find_element_by_name("wd").send_keys("python")#send_keys是輸入 #按照頁面屬性name定位到輸入框並輸入“python” driver.find_element_by_id("su").click()#click是點擊 #按照頁面屬性id定位到百度一下並點擊 t.sleep(3) #停留5秒 driver.quit() #退出
-
class name定位方法
- 查看classname方法同上
- 代碼
from selenium import webdriver import time as t #導入庫 driver=webdriver.Chrome() #指定被測的瀏覽器並且對webdriver進行實例化 driver.get("http://www.baidu.com/") #導航到被測網址 t.sleep(2) #停留2秒 driver.find_element_by_class_name("s_ipt").send_keys("python")#send_keys是輸入 #按照頁面屬性class name定位到輸入框並輸入“python” driver.find_element_by_id("su").click()#click是點擊 #按照頁面屬性id定位到百度一下並點擊 t.sleep(3) #停留5秒 driver.quit() #退出
-
xpath定位方法(在前面方法使用不了的情況下使用)
- 查看xpath方法
-
-
- 代碼
from selenium import webdriver import time as t #導入庫 driver=webdriver.Chrome() #指定被測的瀏覽器並且對webdriver進行實例化 driver.get("http://www.baidu.com/") #導航到被測網址 t.sleep(2) #停留2秒 driver.find_element_by_xpath('//*[@id="kw"]').send_keys("python") #按照頁面屬性xpath定位到輸入框並輸入“python” driver.find_element_by_xpath('//*[@id="su"]').click()#click是點擊 #按照頁面屬性xpath定位到百度一下並點擊 t.sleep(3) #停留5秒 driver.quit() #退出
-
css selector 定位方法
- 查看css selector方法
- 代碼
-
-
- 代碼:
from selenium import webdriver import time as t #導入庫 driver=webdriver.Chrome() #指定被測的瀏覽器並且對webdriver進行實例化 driver.get("http://www.baidu.com/") #導航到被測網址 t.sleep(2) #停留2秒 driver.find_element_by_css_selector('#kw').send_keys("python") #按照頁面屬性css selector定位到輸入框並輸入“python” driver.find_element_by_css_selector('#su').click()#click是點擊 #按照頁面屬性css selector定位到百度一下並點擊 t.sleep(3) #停留5秒 driver.quit() #退出
- 代碼:
-
link text 超鏈接精確定位方法
- 查看屬性是否為超鏈接
-
-
-
- 代碼
from selenium import webdriver import time as t #導入庫 driver=webdriver.Chrome() #指定被測的瀏覽器並且對webdriver進行實例化 driver.get("http://www.baidu.com/") #導航到被測網址 t.sleep(2) #停留2秒 driver.find_element_by_link_text("新聞").click()#click是點擊 #按照頁面屬性超鏈接定位“新聞”並點擊 t.sleep(3) #停留5秒 driver.quit() #退出
- 代碼
-
partial link text 超鏈接模糊定位方法
- 查看屬性是否為超鏈接方法如上
- 代碼
from selenium import webdriver import time as t #導入庫 driver=webdriver.Chrome() #指定被測的瀏覽器並且對webdriver進行實例化 driver.get("http://www.baidu.com/") #導航到被測網址 t.sleep(2) #停留2秒 driver.find_element_by_partial_link_text("hao").click()#click是點擊 #按照頁面屬性超鏈接模糊定位“hao123“並點擊 t.sleep(3) #停留5秒 driver.quit() #退出
-
tag name定位方法
-
tag_name可以理解為是標簽,怎么理解了,就是就是百度搜索輸入框,它的標簽是input,那么針對這種我們可以使用標簽的方式來進行,使用到的方法是ftag_name
-
測試代碼如下:
from selenium import webdriver import time as t driver=webdriver.Chrome() driver.get('http://www.baidu.com') driver.find_element_by_tag_name('input').send_keys('UI自動化測試') t.sleep(3) driver.quit()
當我們執行以上代碼的時候,就會報錯:
F:\python\code\testshare\練習\share\練習.py:11: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead driver.find_element_by_tag_name('input').send_keys('UI自動化測試') Traceback (most recent call last): File "F:\python\code\testshare\練習\share\練習.py", line 11, in <module> driver.find_element_by_tag_name('input').send_keys('UI自動化測試') File "F:\Python3\lib\site-packages\selenium\webdriver\remote\webelement.py", line 540, in send_keys self._execute(Command.SEND_KEYS_TO_ELEMENT, File "F:\Python3\lib\site-packages\selenium\webdriver\remote\webelement.py", line 710, in _execute return self._parent.execute(command, params) File "F:\Python3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 424, in execute self.error_handler.check_response(response) File "F:\Python3\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable (Session info: chrome=96.0.4664.45) Stacktrace: Backtrace: Ordinal0 [0x01146903+2517251] Ordinal0 [0x010DF8E1+2095329] Ordinal0 [0x00FE2710+1058576] Ordinal0 [0x01008993+1214867] Ordinal0 [0x010080DF+1212639] Ordinal0 [0x010264D3+1336531] Ordinal0 [0x01003A36+1194550] Ordinal0 [0x010265BA+1336762] Ordinal0 [0x01035BBF+1399743] Ordinal0 [0x0102639B+1336219] Ordinal0 [0x010027A7+1189799] Ordinal0 [0x01003609+1193481] GetHandleVerifier [0x012D5904+1577972] GetHandleVerifier [0x01380B97+2279047] GetHandleVerifier [0x011D6D09+534521] GetHandleVerifier [0x011D5DB9+530601] Ordinal0 [0x010E4FF9+2117625] Ordinal0 [0x010E98A8+2136232] Ordinal0 [0x010E99E2+2136546] Ordinal0 [0x010F3541+2176321] BaseThreadInitThunk [0x7755FA29+25] RtlGetAppContainerNamedObjectPath [0x77B27A9E+286] RtlGetAppContainerNamedObjectPath [0x77B27A6E+238]
出現這個問題說明元素定位找不到,導致錯誤,那么有可能是定位到的元素屬性是錯誤,還有一種是我們需要索引的方式來解決。
-
-
如果是后者,是單個元素定位的方式無法解決的,多個元素定位方法可以解決,如下。
-
多個元素定位方法
- 需求:當元素屬性的ID,name等完全一致的時候,無法使用單個元素定位的方式來解決,那么可以使用多個元素定位的方式來進行
- 解決思路:獲取元素的屬性是一個列表,看我們被定位的目標屬性是在第幾位,通過索引來定位
- 如上面百度搜索輸入框為案例,我們前面使用的是input標簽的方式進行定位的,但是我們通過查找標簽發現input有8個標簽,不是唯一性的:
- 針對這種元素不是唯一性的,就可以使用多個元素定位方法解決,多個元素獲取到的是一個列表,那么我們就可以使用列表的索引進行定位,通過上圖我們得知搜索框的索引為7,測試代碼如下:
from selenium import webdriver #導入庫里面的模塊 import time as t #導入庫 driver=webdriver.Chrome() driver.get("http://www.baidu.com") tags=driver.find_elements_by_tag_name("input") #把查找到的是一個列表,給他一個變量tags tags[7].send_keys("UI自動化測試") #在列表中索引為7的位置(也就是搜索框)輸入“UI自動化測試” t.sleep(3) #停留/等待三秒 driver.find_element_by_id("su").click() #點擊搜索 t.sleep(3) driver.quit()#關閉
-
iframe框架定位方法
-
需求:如QQ郵箱的的登錄頁面,登錄按鈕是在一個框架中如QQ郵箱的的登錄頁面,登錄按鈕是在一個框架中如QQ郵箱的的登錄頁面,登錄按鈕是在一個框架中
我們通過查看源代碼的方式也可以看到他是在一個frame的框架中
-
-
-
解決思路:首先進入框架,再定位到元素操作
-
id方法:
from selenium import webdriver#導入庫的模塊 import time as t#導入庫 driver=webdriver.Chrome()#進入要操作的瀏覽器 driver.maximize_window()#瀏覽器最大化 driver.get("https://mail.qq.com/")#進入要測試的網址 driver.switch_to.frame("login_frame")#進入到要操作的框架 driver.find_element_by_link_text("帳號密碼登錄").click()#定位到元素並點擊 driver.quit()#退出瀏覽器
-
name方法:
from selenium import webdriver#導入庫的模塊 import time as t#導入庫 driver=webdriver.Chrome()#進入要操作的瀏覽器 driver.maximize_window()#瀏覽器最大化 driver.get("https://mail.qq.com/")#進入要測試的頁面 t.sleep(3)#停留3秒 driver.switch_to.frame("login_frame")#通過name進入框架 t.sleep(3)#停留三秒 driver.find_element_by_link_text("帳號密碼登錄").click()#定位到元素並點擊 t.sleep(3)#停留3秒 driver.quit()#退出
-
索引方法:
from selenium import webdriver#導入庫的模塊 import time as t#導入time庫 driver=webdriver.Chrome()#進入測試的瀏覽器 driver.maximize_window()#瀏覽器最大化 driver.get("https://mail.163.com/") #進去需要測試的頁面 t.sleep(5)#停留5秒 driver.switch_to.frame(0)#通過索引進入模塊 driver.find_element_by_name("email").send_keys("242134")#定位到元素進行操作 t.sleep(5)#停留5秒 driver.quit()#退出
-
-
瀏覽器屬性
-
current_url:獲取測試的地址
from selenium import webdriver #導入庫中的模塊 driver=webdriver.Chrome() #打開測試需要使用的瀏覽器 driver.maximize_window() #瀏覽器最大化 driver.get("http://www.baidu.com") #進入測試的網頁 print("測試的地址:",driver.current_url) #輸出測試網頁的地址 assert driver.current_url.endswith("baidu.com/")==True #assert 斷言:期望結果與實際結果是否相符 driver.quit() #退出瀏覽器
輸出結果:
測試的地址: https://www.baidu.com/
-
page_source:獲取測試頁面的源代碼
from selenium import webdriver #導入庫中的模塊 driver=webdriver.Chrome()#測試需要使用的瀏覽器 driver.maximize_window()#瀏覽器最大化 driver.get("http://www.baidu.com")#測試頁面的網址 print("頁面源代碼:",driver.page_source)#獲取源代碼並且輸出 driver.quit()#退出
-
title:獲取頁面的title
from selenium import webdriver #導入庫中的模塊 driver=webdriver.Chrome()#測試需要使用的瀏覽器 driver.maximize_window()#瀏覽器最大化 driver.get("http://www.baidu.com")#測試頁面的網址 print("頁面的title:",driver.title)#獲取頁面的title並輸出 #assert 斷言:期望結果與實際結果是否相符 assert driver.title=="百度一下,你就知道"#判斷頁面的title是否為“百度一下,你就知道” driver.quit()#退出瀏覽器
輸出結果:
頁面的title: 百度一下,你就知道
-
也面對前進forw后退back和刷新refre
from selenium import webdriver #導入庫中的模塊 import time as t #導入庫 driver=webdriver.Chrome()#測試需要使用的瀏覽器 driver.maximize_window()#瀏覽器最大化 driver.get("http://www.baidu.com")#進入測試頁面A的網址 t.sleep(3)#停留3秒 driver.get("https://cn.bing.com/")#進入測試頁面B的網址 t.sleep(3)#停留3秒 driver.back()#后退一步,會進入頁面A print("頁面地址",driver.current_url)#輸出頁面地址 t.sleep(3)#停留3秒 driver.forward()#前進一步,會進入頁面B print("頁面地址:",driver.current_url)#輸出頁面地址 driver.find_element_by_id('sb_form_q').send_keys("123421")#定位到輸入框,輸入內容 t.sleep(3)#停留3秒 driver.refresh()#刷新頁面 t.sleep(3)#停留3秒 driver.quit()#退出瀏覽器
-
頁面的切換
from selenium import webdriver #導入庫里面的模塊 import time as t #導入庫 driver=webdriver.Chrome() #測試使用的瀏覽器 driver.maximize_window() #瀏覽器最大化 driver.get("http://www.baidu.com") #測試的頁面A nowHandler=driver.current_window_handle#定義當前頁面(頁面A) t.sleep(3)#停留3秒 driver.find_element_by_partial_link_text("hao").click()#超鏈接定位屬性hao123,並點擊,會跳轉到頁面B t.sleep(3)#停留3秒 allHandlers=driver.window_handles#定義所有頁面(頁面A和頁面B) driver.switch_to.window(nowHandler)#切換到當前頁面(頁面A) t.sleep(3)#停留3秒 for item in allHandlers: #對所有頁面進行循環 if item!=nowHandler:#如果不是當前頁面(頁面A),那就是頁面B,定義為item driver.switch_to.window(item)#切換到另外一個頁面(頁面B) t.sleep(3)#停留3秒 driver.find_element_by_xpath('//*[@id="search"]/form/div[2]/input').send_keys("hao123")#通過xpath方法定位到搜索框輸入hao123 t.sleep(3)#停留3秒 driver.find_element_by_xpath('//*[@id="search"]/form/div[3]/input').click()#定位到搜索按鈕,點擊,會跳轉到一個新的頁面(頁面C) t.sleep(3)#停留3秒 driver.close()#退出這個頁面(頁面B),就會剩頁面A跟頁面C t.sleep(3)#停留3秒 driver.switch_to.window(nowHandler)#進入當前頁面(頁面A) t.sleep(3)#停留3秒 driver.find_element_by_id("kw").send_keys("baidu")#定位到輸入框輸入baidu t.sleep(3)#停留3秒 driver.quit()#退出瀏覽器
-
clear清空
from selenium import webdriver #導入庫里面的模塊 import time as t #導入庫 driver=webdriver.Chrome() #測試使用的瀏覽器 driver.maximize_window() #瀏覽器最大化 driver.get("http://www.baidu.com") #進入測試的頁面 t.sleep(3)#停留3秒 os=driver.find_element_by_id("kw")#定位到搜索框定義為os os.send_keys("python")#輸入框搜索python t.sleep(3)#停留3秒 os.clear()#清空輸入框 t.sleep(3)#停留3秒 driver.quit()#退出瀏覽器
-
get_attribute獲取元素屬性的值(提示信息)
from selenium import webdriver #導入庫里面的模塊 import time as t #導入庫 driver=webdriver.Chrome() #測試使用的瀏覽器 driver.maximize_window() #瀏覽器最大化 driver.get("http://www.lagou.com")#進入測試頁面 t.sleep(3)#停留3秒 driver.find_element_by_link_text("登錄").click()#點擊超鏈接 t.sleep(3)#停留3秒 login=driver.find_element_by_xpath('/html/body/div[3]/div[1]/div/div/div[2]/div[3]/div[1]/div/div[2]/form/div[1]/div/input')#定位到輸入框並定義 print("元素屬性的值為:",login.get_attribute("placeholder"))#輸出元素屬性的值 t.sleep(3)#停留3秒 driver.quit()#退出瀏覽器
輸出結果:
元素屬性的值為: 請輸入常用手機號
-
所有在input里面輸入的值,都是value的屬性
from selenium import webdriver #導入庫里面的模塊 import time as t #導入庫 driver=webdriver.Chrome() #測試使用的瀏覽器 driver.maximize_window() #瀏覽器最大化 driver.get("http://www.baidu.com")#進入測試頁面 t.sleep(3)#停留3秒 so=driver.find_element_by_id("kw")#定位到輸入框並定義為so so.send_keys("python")#輸入python t.sleep(3)#停留3秒 print("value的值:",so.get_attribute("value"))#輸出value的值 driver.quit()#退出瀏覽器
輸出結果:
value的值: python
-
is_displayed()查看元素是否可見
from selenium import webdriver #導入庫里面的模塊 import time as t #導入庫 driver=webdriver.Chrome() #測試使用的瀏覽器 driver.maximize_window() #瀏覽器最大化 driver.get("http://www.baidu.com")#進入測試頁面 t.sleep(3)#停留3秒 aboutBaidu=driver.find_element_by_link_text("關於百度")#定位到元素“關於百度”並定義 print("是否可見:",aboutBaidu.is_displayed())#判斷是否可見並輸出 driver.quit()#退出瀏覽器
輸出結果:
是否可見: True
-
is_enabled:是否可編輯(readonly:只讀屬性)
from selenium import webdriver #導入庫里面的模塊 import time as t #導入庫 driver=webdriver.Chrome() #測試使用的瀏覽器 driver.maximize_window() #瀏覽器最大化 driver.get("http://www.baidu.com")#進入測試頁面 t.sleep(3)#停留3秒 aboutBaidu=driver.find_element_by_id("kw")#定位到輸入框並定義 print("是否可以編輯/輸入:",aboutBaidu.is_enabled())#判斷是否可以編輯/輸入並輸出 driver.quit()#退出瀏覽器
輸出結果:
是否可以編輯/輸入: True
-
is_selected:判斷單選按鈕是否勾選
from selenium import webdriver #導入庫里面的模塊 import time as t #導入庫 driver=webdriver.Chrome() #測試使用的瀏覽器 driver.maximize_window() #瀏覽器最大化 driver.get("https://mail.sina.com.cn/")#到需要測試的頁面 autoLogin=driver.find_element_by_id("store1")#定位到單選按鈕 t.sleep(3)#停留3秒 print("點擊前是否勾選:",autoLogin.is_selected())#判斷單選按鈕是否勾選並輸出 t.sleep(3)#停留3秒 autoLogin.click()#點擊單選按鈕 t.sleep(3)#停留3秒 print("點擊后是否勾選:",autoLogin.is_selected())#判斷單選按鈕是否勾選並輸出 driver.quit()#退出瀏覽器
輸出結果:
點擊前是否勾選: True 點擊后是否勾選: False
-
三.selenium中類的使用
-
Select:針對下拉框的屬性選擇操作
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <center> 喜歡的編程語言: <select id="nr"> <option value="" selected>請選擇您喜歡的編程語言</option> <option value="Python">Python語言</option> <option value="Go">Go語言</option> <option value="Java">Java語言</option> </select> </center> </body> </html>
-
索引方法
from selenium import webdriver #導入庫里面的模塊 from selenium.webdriver.support.select import Select #導入模塊 import time as t #導入庫 driver=webdriver.Chrome()#測試需要的瀏覽器 driver.maximize_window()#瀏覽器最大化 driver.get('file:///F:/python/code/testdev/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/demo.html')#打開需要測試的頁面 t.sleep(2)#停留2秒 nr=driver.find_element_by_id("nr")#定位到下拉框並定義 select=Select(webelement=nr)#Select類的實例化 select.select_by_index(3)#根據索引選擇屬性 t.sleep(3)#停留3秒 driver.quit()#退出
-
value方法
from selenium import webdriver #導入庫里面的模塊 from selenium.webdriver.support.select import Select #導入模塊 import time as t #導入庫 driver=webdriver.Chrome()#測試需要的瀏覽器 driver.maximize_window()#瀏覽器最大化 driver.get('file:///F:/python/code/testdev/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/demo.html')#打開需要測試的頁面 t.sleep(2)#停留2秒 nr=driver.find_element_by_id("nr")#定位到下拉框並定義 select=Select(webelement=nr)#Select類的實例化 select.select_by_value("Java")#根據value選擇屬性 t.sleep(3)#停留3秒 driver.quit()#退出
-
文本方法
from selenium import webdriver #導入庫里面的模塊 from selenium.webdriver.support.select import Select #導入模塊 import time as t #導入庫 driver=webdriver.Chrome()#測試需要的瀏覽器 driver.maximize_window()#瀏覽器最大化 driver.get('file:///F:/python/code/testdev/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/demo.html')#打開需要測試的頁面 t.sleep(2)#停留2秒 nr=driver.find_element_by_id("nr")#定位到下拉框並定義 select=Select(webelement=nr)#Select類的實例化 select.select_by_visible_text('Java語言')#根據文本選擇屬性 t.sleep(3)#停留3秒 driver.quit()#退出
-
-
-
拉勾網下拉框實戰
from selenium import webdriver #導入庫里面的模塊 from selenium.webdriver.support.select import Select #導入模塊 import time as t #導入庫 driver=webdriver.Chrome()#測試需要的瀏覽器 driver.maximize_window()#瀏覽器最大化 driver.get("https://www.lagou.com/")#進入需要測試的頁面 t.sleep(2)#停留2秒 driver.find_element_by_id('search_input').send_keys("測試開發工程師")#定位到輸入框並輸入“測試開發工程師” t.sleep(2)#停留2秒 driver.find_element_by_id('search_button').click()#定位到搜索並點擊 t.sleep(2)#停留2秒 driver.find_element_by_xpath('//*[@id="jobsContainer"]/div[2]/div[1]/div[1]/div[2]/div/ul/li[2]/div/i').click()#定位到學歷要求下拉框並點擊 t.sleep(3)#停留3秒 driver.find_element_by_xpath('//*[@id="jobsContainer"]/div[2]/div[1]/div[1]/div[2]/div/ul/li[2]/div/div/ul[2]/li[4]/span').click()#選擇下拉框屬性並點擊 t.sleep(3)#停留3秒 driver.quit()#退出測試
-
-
Alert類:針對彈出框的操作處理
-
方法:
- text:獲取彈出框的文本信息
- accept是接受Confirm彈出框
- dismiss是拒絕接受Confirm彈出框
- send_keys是在Prompt消息對話框里面輸入想要輸入的內容
-
警告框
from selenium import webdriver #導入selenium庫的webdriver包 from selenium.webdriver.common.by import By #導入By模塊 from selenium.webdriver.common.action_chains import ActionChains #導入ActionChains模塊 import time as t #導入time庫 driver=webdriver.Chrome() #打開測試的瀏覽器並定義 driver.maximize_window() #瀏覽器最大化 driver.get('http://www.baidu.com') #打開需要測試的網址 driver.implicitly_wait(30) #添加時間限制,如果30秒沒有打開被測試網站,就會報錯 locator=driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')#獲取到百度設置的元素屬性 action=ActionChains(driver=driver) #針對ActionChains類的實例化 action.move_to_element(locator).perform() #將鼠標移動到定位到元素的位置並執行 t.sleep(5) #停留5秒 driver.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[1]').click()#點擊搜索設置 t.sleep(5) #停留5秒 driver.find_element_by_xpath('//*[@id="se-setting-7"]/a[2]').click()#點擊保存設置 t.sleep(5) #停留5秒 print('警告框的文本信息為:',driver.switch_to.alert.text)#獲取到彈出框的文本信息並輸出 driver.quit()#退出
輸出結果:
警告框的文本信息為: 已經記錄下您的使用偏好
-
確認框
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script type="text/javascript"> function disp_confirm() { var r=confirm("請您點擊按鈕!") if(r==true) { document.write("您點擊了確認按鈕") } else { document.write("您點擊了取消按鈕") } } </script> </head> <body> <center> <input type="button" onclick="disp_confirm()" value="請點擊"> </center> </body> </html>
測試代碼如下:
from selenium import webdriver #導入selenium庫的webdriver包 from selenium.webdriver.common.by import By #導入By模塊 from selenium.webdriver.common.action_chains import ActionChains #導入ActionChains模塊 import time as t #導入time庫 driver=webdriver.Chrome() #打開測試的瀏覽器並定義 driver.maximize_window() #瀏覽器最大化 driver.get('file:///F:/python/code/testdev/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/%E6%B6%88%E6%81%AF%E4%BA%A4%E4%BA%92%E6%A1%86/%E4%BA%A4%E4%BA%92%E6%A1%86.html') #打開需要測試的頁面 t.sleep(3)#停留3秒 driver.find_element_by_xpath('/html/body/center/input').click()#定位到元素並點擊 t.sleep(3)#停留3秒 driver.switch_to.alert.accept()#選擇確認 t.sleep(3)#停留3秒 driver.refresh()#點擊確定 driver.find_element_by_xpath('/html/body/center/input').click()#定位到按鈕元素並點擊 t.sleep(3)#停留3秒 driver.switch_to.alert.dismiss()#選擇取消 t.sleep(3)#停留3秒 driver.quit()#退出
-
消息對話框
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script type="text/javascript"> function disp_prompt() { var name=prompt("請輸入您的姓名:","") if(name!=null && name!="") { document.write("Hello "+name+"!") } } </script> </head> <body> <center> <input type="button" onclick="disp_prompt()" value="請點擊我!"> </center> </body> </html>
測試代碼如下:
from selenium import webdriver #導入selenium庫的webdriver包 from selenium.webdriver.common.by import By #導入By模塊 from selenium.webdriver.common.action_chains import ActionChains #導入ActionChains模塊 import time as t #導入time庫 driver=webdriver.Chrome() #打開測試的瀏覽器並定義 driver.maximize_window() #瀏覽器最大化 driver.get('file:///F:/python/code/testdev/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/%E6%B6%88%E6%81%AF%E5%AF%B9%E8%AF%9D%E6%A1%86/%E6%B6%88%E6%81%AF%E5%AF%B9%E8%AF%9D%E6%A1%86.html') #進入需要測試的頁面 t.sleep(2)#停留2秒 driver.find_element_by_xpath('/html/body/center/input').click()#定位到元素並點擊 t.sleep(2)#停留2秒 driver.switch_to.alert.send_keys("特昂糖")#定位到輸入框並輸入內容 t.sleep(3)#停留3秒 driver.switch_to.alert.accept()#點擊確認按鈕 t.sleep(3)#停留3秒 driver.quit()#退出測試
-
-
ActionChains類:針對鼠標事件的操作
-
懸浮:move_to_element
from selenium import webdriver #導入selenium庫的webdriver包 from selenium.webdriver.common.by import By #導入By模塊 from selenium.webdriver.common.action_chains import ActionChains #導入ActionChains模塊 import time as t #導入time庫 driver=webdriver.Chrome() #打開測試的瀏覽器並定義 driver.maximize_window() #瀏覽器最大化 driver.get('http://www.baidu.com') #打開需要測試的網址 driver.implicitly_wait(30) #添加時間限制,如果30秒沒有打開被測試網站,就會報錯 locator=driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')#獲取到百度設置的元素屬性 action=ActionChains(driver=driver) #針對ActionChains類的實例化 action.move_to_element(locator).perform() #將鼠標移動到定位到元素的位置並執行 t.sleep(5) #停留5秒 driver.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[1]').click()#點擊搜索設置 t.sleep(5) #停留5秒 driver.find_element_by_xpath('//*[@id="se-setting-7"]/a[2]').click()#點擊保存設置 t.sleep(5) #停留5秒 print('警告框的文本信息為:',driver.switch_to.alert.text)#獲取到彈出框的文本信息並輸出 driver.quit()#退出
輸出結果:
警告框的文本信息為: 已經記錄下您的使用偏好
-
右鍵單擊:context_click
from selenium import webdriver#導入模塊 from selenium.webdriver.common.action_chains import ActionChains#導入模塊 import time as t#導入庫 driver=webdriver.Chrome()#打開測試需要的瀏覽器 driver.maximize_window()#瀏覽器最大化 driver.get('https://pan.baidu.com/')#打開測試的頁面 t.sleep(3)#停留3秒 driver.find_element_by_id('TANGRAM__PSP_4__smsSwitchWrapper').click()#點擊短信快捷登錄 t.sleep(3)#停留3秒 driver.find_element_by_id('TANGRAM__PSP_4__smsPhone').send_keys('XXXXXXXXXX')#輸入手機號 t.sleep(3)#停留3秒 driver.find_element_by_id('TANGRAM__PSP_4__smsTimer').click()#點擊發送驗證碼 t.sleep(20)#停留20秒 driver.find_element_by_id('TANGRAM__PSP_4__smsSubmit').click()#點擊登錄 t.sleep(10)#停留10秒 obj=ActionChains(driver=driver)#ActionChains類的實例化 ceshi=driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[2]/div[3]/div/div/dd[3]/div[2]/div[1]/a')#獲取元素屬性的對象 t.sleep(3)#停留3秒 obj.context_click(ceshi).perform()#右鍵單擊 t.sleep(3)#停留3秒 driver.quit()#退出測試
測試頁面是以百度網盤為例
-
雙擊:double_click
from selenium import webdriver#導入模塊 from selenium.webdriver.common.action_chains import ActionChains#導入模塊 import time as t#導入庫 driver=webdriver.Chrome()#打開測試需要的瀏覽器 driver.maximize_window()#瀏覽器最大化 driver.get("https://www.baidu.com")#打開測試的頁面 t.sleep(3)#停留3秒 obj=ActionChains(driver=driver) driver.find_element_by_id('kw').send_keys("python自動化測試")#定位到元素並輸入 t.sleep(3)#停留3秒 so=driver.find_element_by_id("su")#定位到元素並定義 obj.double_click(so).perform()#雙擊元素 t.sleep(3)#停留3秒 driver.quit()#退出測試
-
-
WebDriverWait類:等待
在UI的自動化測試中,經常會由於網絡加載慢的問題導致資源加載不出來,從而影響測試的效率,之前我們對這樣的處理方案是使用了time庫里面的sleep()方法來休眠幾秒鍾,但是這樣的方式畢竟不是很好的解決方案。
在UI自動化測試中,關於等待的部分,主要匯總為如下三點,具體如下:
1、固定等待,也就是使用sleep()方法 2、隱式等待,使用到的方法是implicitly_wait的方法,可以把它理解為設置最長等待時間(隱式等待實際是設置了一個最長等待時間,如果在規定時間內網頁加載完成,則執行下一步,否則一直等到時間結束,然后執行下一步) 3、顯式等待,主要指的是程序每隔一段時間執行自定義的程序判斷條件,如果判斷成立,程序就會繼續執行,那么如果判斷失敗,就會報TimeOutExpection的異常信息
-
-
WebDriverWait參數
driver: 傳入WebDriver實例,即我們上例中的driver timeout: 超時時間,等待的最長時間 poll_frequency: 調用until或until_not中的方法的間隔時間,默認是0.5秒 ignored_exceptions: 忽略的異常,如果在調用until或until_not的過程中拋出這個元組中的異常,則不中斷代碼,繼續等待,
如果拋出的是這個元組外的異常,則中斷代碼,拋出異常。默認只有NoSuchElementException這個模塊中,一共只有兩種方法until與until_not
until:當某個元素出現或者條件成立則會繼續執行
until_not:當某元素消失或什么條件不成立則繼續執行
method: 在等待期間,每隔一段時間調用這個傳入的方法,直到返回值不是False message: 如果超時,拋出TimeoutException,將message傳入異常 -
實戰(以百度首頁為例)
-
隱式等待實戰
'''模塊跟庫的導入''' from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as es import time as t driver=webdriver.Chrome()#測試測瀏覽器 driver.maximize_window()#瀏覽器最大化 driver.get("http://www.baidu.com")#測試的頁面 '''設置一個隱式等待時間30秒,在這個時間內頁面加載完成會進行下一步,如遇網絡不良情況規定時間未完成加載就會報錯''' #隱式等待 driver.implicitly_wait(30) #顯示等待 '''當期望的元素出現才會繼續執行,時間限制10秒,沒出現條件就會報錯''' wait=WebDriverWait(driver=driver,timeout=10).until(method=es.element_to_be_clickable((By.ID,'kw'))) wait.send_keys("等待")#元素中輸入內容 t.sleep(3)#固定等待3秒 driver.quit()#退出測試
-
指定元素的文本位置
'''模塊跟庫的導入''' from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as es import time as t driver=webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(30) driver.get("https://mail.sina.com.cn/") #點擊登錄按鈕 driver.find_element_by_class_name('loginBtn').click() t.sleep(3) divText=WebDriverWait(driver=driver,timeout=10).until( es.element_to_be_clickable(( By.XPATH, '/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]'))) t.sleep(3) assert divText.text=='請輸入郵箱名' driver.quit()
-
元素是否可見
'''模塊跟庫的導入''' from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as es import time as t driver=webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(30) driver.get("http://www.baidu.com") aboutBaidu=WebDriverWait( driver=driver, timeout=10).until( es.element_to_be_clickable(( By.LINK_TEXT,'關於百度'))) aboutBaidu.click() driver.quit()
-
-
-
keys模塊:鍵盤事件
-
模塊的導入
from selenium.webdriver.common.keys import Keys
-
方法的查看
NULL = u'\ue000' CANCEL = u'\ue001' # ^break HELP = u'\ue002' BACKSPACE = u'\ue003' BACK_SPACE = BACKSPACE #刪除鍵 TAB = u'\ue004' #TAB鍵 CLEAR = u'\ue005' RETURN = u'\ue006' ENTER = u'\ue007' #回車鍵 SHIFT = u'\ue008' #shift鍵 LEFT_SHIFT = SHIFT CONTROL = u'\ue009' #Ctrl鍵 LEFT_CONTROL = CONTROL ALT = u'\ue00a' LEFT_ALT = ALT PAUSE = u'\ue00b' ESCAPE = u'\ue00c' SPACE = u'\ue00d' PAGE_UP = u'\ue00e' PAGE_DOWN = u'\ue00f' END = u'\ue010' HOME = u'\ue011' LEFT = u'\ue012' ARROW_LEFT = LEFT UP = u'\ue013' ARROW_UP = UP RIGHT = u'\ue014' ARROW_RIGHT = RIGHT DOWN = u'\ue015' ARROW_DOWN = DOWN INSERT = u'\ue016' DELETE = u'\ue017' SEMICOLON = u'\ue018' EQUALS = u'\ue019' NUMPAD0 = u'\ue01a' # number pad keys NUMPAD1 = u'\ue01b' NUMPAD2 = u'\ue01c' NUMPAD3 = u'\ue01d' NUMPAD4 = u'\ue01e' NUMPAD5 = u'\ue01f' NUMPAD6 = u'\ue020' NUMPAD7 = u'\ue021' NUMPAD8 = u'\ue022' NUMPAD9 = u'\ue023' MULTIPLY = u'\ue024' ADD = u'\ue025' SEPARATOR = u'\ue026' SUBTRACT = u'\ue027' DECIMAL = u'\ue028' DIVIDE = u'\ue029' F1 = u'\ue031' # function keys F2 = u'\ue032' F3 = u'\ue033' F4 = u'\ue034' F5 = u'\ue035' F6 = u'\ue036' F7 = u'\ue037' F8 = u'\ue038' F9 = u'\ue039' F10 = u'\ue03a' F11 = u'\ue03b' F12 = u'\ue03c' META = u'\ue03d' COMMAND = u'\ue03d'
使用Ctrl+鼠標左鍵查看模塊的源代碼,就可以看到鍵盤的使用方法
-
方法的操作
-
回車事件:send_keys(Keys.ENTER)
'''模塊跟庫的導入''' from selenium import webdriver from selenium.webdriver.common.keys import Keys import time as t driver=webdriver.Chrome() #打開測試需要的瀏覽器 driver.maximize_window() #瀏覽器最大化 driver.get('http://www.baidu.com') #需要測試的頁面 so=driver.find_element_by_id('kw') #定位到元素並定義為so t.sleep(3) #固定等待3秒 so.send_keys('自動化測試') #輸入‘自動化測試’ t.sleep(3)#固定等待3秒 so.send_keys(Keys.ENTER)#元素按回車 t.sleep(3)#固定等待3秒 driver.quit()#退出測試
以百度首頁輸入框為例
-
快捷鍵的使用
-
復制
send_keys(Keys.CONTROL,'c')
-
粘貼
send_keys(Keys.CONTROL,'v')
-
剪切
send_keys(Keys.CONTROL,'x')
-
全選
send_keys(Keys.CONTROL,'a')
- 實戰(以百度首頁輸入框為例)
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time as t driver=webdriver.Chrome() #打開測試需要的瀏覽器 driver.maximize_window() #瀏覽器最大化 driver.get('http://www.baidu.com') #需要測試的頁面 so=driver.find_element_by_id('kw') #定位到元素並定義為so t.sleep(3)#固定等待3秒 so.send_keys("自動化測試") t.sleep(3)#固定等待3秒 so.send_keys(Keys.CONTROL,'a')#全選 t.sleep(3)#固定等待3秒 so.send_keys(Keys.CONTROL,'c')#復制 so.send_keys(Keys.BACKSPACE)#刪除 t.sleep(3)#固定等待3秒 so.send_keys("接口測試")#輸入內容 t.sleep(3)#固定等待3秒 so.send_keys(Keys.CONTROL,'v')#粘貼 t.sleep(3)#固定等待3秒 so.send_keys(Keys.ENTER)#回車 t.sleep(3)#固定等待3秒 driver.quit()#退出測試
-
-
-
-
JavaScript
-
瀏覽器的滑動
瀏覽器的滑動主要分為瀏覽器的向上和向下,比如我們就以百度搜索引擎為案例,我們進行關鍵字的搜索后,想點幾下一步操作,但是下一步無法展示出來,就需要把頁面滑動到底部才可以展示出來
測試代碼如下:
from selenium import webdriver import time as t driver=webdriver.Chrome()#定義測試需要的瀏覽器 driver.maximize_window()#瀏覽器最大化 driver.get('http://www.baidu.com')#測試需要的頁面 driver.implicitly_wait(30)#隱式等待30秒 t.sleep(3)#固定等待3秒 driver.find_element_by_id('kw').send_keys("測試開發")#定位到元素並輸入 driver.find_element_by_id('su').click()#定位到元素並點擊 t.sleep(3)#固定等待3秒 down='var q=document.documentElement.scrollTop=10000' #定義JavaScript driver.execute_script(down) #執行JavaScript t.sleep(3)#固定等待3秒 driver.find_element_by_xpath('//*[@id="page"]/div/a[10]').click()#點擊下一頁 t.sleep(3)#固定等待3秒 driver.execute_script(down)#執行JavaScript t.sleep(3)#固定等待3秒 up='var q=document.documentElement.scrollTop=0'#定義JavaScript t.sleep(3)#固定等待3秒 driver.execute_script(up)#執行JavaScript driver.quit()#退出測試
-
富文本的處理
現在互聯網的產品基本都會使用到富文本的信息,針對富文本的特性,其實我們有兩個思路來實現元素的定位方式,一種是iframe的思路,另外一種是JS的方式。
查看源代碼:
iframe測代碼如下:
from selenium import webdriver#模塊的導入 import time as t#導入庫 driver=webdriver.Chrome()#定義測試的瀏覽器 driver.maximize_window()#瀏覽器最大化 driver.get('https://uutool.cn/ueditor/')#測試的頁面 driver.implicitly_wait(20)#隱式等待20秒 t.sleep(3)#固定等待3秒 driver.switch_to.frame('ueditor_0')#進入到iframe框架 t.sleep(3)#固定等待3秒 driver.find_element_by_xpath('/html/body/p').send_keys('測試開發工程師')#定位元素並輸入內容 t.sleep(3)#固定等待3秒 driver.quit()#退出測試
Js測試代碼如下:
from selenium import webdriver#模塊的導入 import time as t#導入庫 def richText(driver,content): ''' 實現在富文本里面輸入內容:param driver:webdriver實例化后的對象信息:param content:富文本里面需要輸入的文字內容:return: ''' js="document.getElementById('ueditor_0').contentWindow.document.body.innerHTML='{0}'".format(content) driver.execute_script(js) driver=webdriver.Chrome()#定義測試的瀏覽器 driver.maximize_window()#瀏覽器最大化 driver.get('https://uutool.cn/ueditor/')#測試的頁面 driver.implicitly_wait(20)#隱式等待 t.sleep(3)#固定等待3秒 richText(driver=driver,content="我使用了Js來進行處理") #函數的調用 t.sleep(3)#固定等待3秒 driver.quit()#退出測試
-
時間控件的處理
在如上的代碼中可以很清晰的看到它是只讀屬性,那么我們需要填寫時間的屬性,具體解決問題的步驟為: 1.取消時間控件的只讀屬性 2.取消只讀屬性后,操作input控件的value,其實我們知道input里面輸入的內容最終是在value的屬性里面。
測試代碼如下:
from selenium import webdriver#模塊的導入 import time as t#庫的導入 def startTime(driver,content): '''開始時間控件''' js="$(\"input[placeholder='開始時間≥當前時間']\").removeAttr('readonly');" \ "$(\"input[placeholder='開始時間≥當前時間']\").attr('value','{0}')".format(content) driver.execute_script(js) def endTime(driver,content): '''結束時間控件''' js="$(\"input[placeholder='結束時間>開始時間']\").removeAttr('readonly');" \ "$(\"input[placeholder='結束時間>開始時間']\").attr('value','{0}')".format(content) driver.execute_script(js) driver=webdriver.Chrome()#定義需要測試的瀏覽器 driver.maximize_window()#瀏覽器最大化 driver.get('file:///F:/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/Time/index.html')#測試的頁面 driver.implicitly_wait(20)#隱式等待 t.sleep(3)#固定等待3秒 startTime(driver,"2021-12-05 00:00:00")#調用開始時間控件 t.sleep(3)#固定等待3秒 endTime(driver,"2021-12-06 00:00:00")#調用結束時間控件 t.sleep(3)#固定等待3秒 driver.quit()#退出測試
-