本文為霍格沃茲測試開發學社學員學習筆記分享
原文連結:使用者端web自動化測試1 - 學習筆記 - 測試人社群
Web自動化的價值和體系
1、什麼時候可以做UI自動化測試
- 業務流程不頻繁改動
- UI 元素不頻繁改動
- 需要頻繁回歸的場景
- 核心場景等
2、 Web自動化測試相關技術
- Selenium:支援多語言,行業内最火最主流
- Pytest/JUnit5:最好用最全面的單元測試架構
- Allure:測試報告
Selenium簡介
- 用于web浏覽器測試的工具
- 支援的浏覽器包括IE,Firefox,Safari,Chrome,Edge等
- 使用簡單,可使用Java,Python等多種語言編寫用例腳本
- 主要由三個工具構成:WebDriver、IDE、Grid
Selenium環境配置步驟
- 準備好Python/Java環境
- 準備好selenium依賴
- driver的下載下傳與配置(Mac與Windows不同)
- 在代碼中import對應的依賴
自動化測試用例結構分析
- 用例标題
- 前提條件
- 用例步驟
- 預期結果
- 實際結果
web 浏覽器控制
- get方法打開浏覽器*
from selenium import webdriver
import time
def window_start():
# 執行個體化chromedriver
driver = webdriver.Chrome()
# 打開網站
driver.get('http://www.ceshiren.com')
# 等待一秒
time.sleep(1)
if __name__ == '__main__':
window_start()
- refresh方法重新整理頁面
from selenium import webdriver
import time
def window_refresh():
# 執行個體化chromedriver
driver = webdriver.Chrome()
# 打開網站
driver.get('http://www.ceshiren.com')
# 等待一秒
time.sleep(1)
# 重新整理網頁
driver.refresh()
# 等待一秒
time.sleep(1)
if __name__ == '__main__':
window_refresh()
- 用back方法回退到上一個界面
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
def window_back():
# 執行個體化chromedriver
driver = webdriver.Chrome()
# 打開網站
driver.get('http://www.ceshiren.com')
# 等待一秒
time.sleep(1)
driver.find_element(By.XPATH,"//*[@id='ember35']").click()
# 等待一秒
time.sleep(1)
# 傳回上一個界面
driver.back()
# 等待一秒
time.sleep(1)
if __name__ == '__main__':
window_back()
- maximize_window方法使視窗最大化
def max_window():
# 執行個體化chromedriver
driver = webdriver.Chrome()
# 打開網站
driver.get('http://www.ceshiren.com')
# 等待一秒
time.sleep(1)
# 螢幕最大化
driver.maximize_window()
# 等待一秒
time.sleep(1)
if __name__ == '__main__':
max_window()
- minimize_window方法使視窗最小化
from selenium import webdriver
import time
def min_window():
# 執行個體化chromedriver
driver = webdriver.Chrome()
# 打開網站
driver.get('http://www.ceshiren.com')
# 等待一秒
time.sleep(1)
# 螢幕最小化
driver.minimize_window()
# 等待一秒
time.sleep(1)
if __name__ == '__main__':
min_window()
常見控件定位方法
class name class 屬性對應的值 css selector(重點)css 表達式 id(重點) id 屬性對應的值 name(重點) name 屬性對應的值 link text 查找其可見文本與搜尋值比對的錨元素 partial link text 查找其可見文本包含搜尋值的錨元素。如果多個元素比對,則隻會選擇第一個元素。 tag name 标簽名稱 xpath(重點) xpath表達式
selenium 常用定位方式
#格式:
driver.find_element_by_定位方式(定位元素)
driver.find_element(By.定位方式, 定位元素)
強制等待與隐式等待 1、強制等待
- 強制等待,線程休眠一定時間
- time.sleep(3)
from selenium import webdriver
from selenium.webdriver.common.by import By
def wait_sleep():
"""
如果直接執行,不添加任何等待,可能會報錯
"""
driver = webdriver.Chrome()
driver.get("https://vip.ceshiren.com/")
# 添加等待,讓頁面渲染完成
time.sleep(3)
driver.find_element(By.XPATH, "//*[text()='個人中心']")
if __name__ == '__main__':
wait_sleep()
2、隐式等待
- 原理:設定一個等待時間,輪詢查找(預設0.5秒)元素是否出現,如果沒出現就抛出異常
#設定一個等待時間,輪詢查找(預設0.5秒)元素是否出現,如果沒出現就抛出異常
driver.implicitly_wait(3)
隐式等待無法解決的問題
- 元素可以找到,使用點選等操作,出現報錯
- 原因: 頁面元素加載是異步加載過程,通常html會先加載完成,js、css其後 元素存在與否是由HTML決定,元素的互動是由css或者js決定 隐式等待隻關注元素能不能找到,不關注元素能否點選或者進行其他的互動
- 解決方案:使用顯式等待
常見控件互動方法
點選,輸入,清空
- 點選百度搜尋框
- 輸入”霍格沃茲測試開發”
- 清空搜尋框中資訊
# 點選百度搜尋框
driver.find_element(By.ID,"kw").click()
# 輸入"霍格沃茲測試開發"
driver.find_element(By.ID,"kw").send_keys("霍格沃茲測試開發")
# 清空搜尋框中資訊
driver.find_element(By.ID,"kw").clear()
自動化測試定位政策
選擇定位器通用原則
- 與研發約定的屬性優先(class屬性: [name='locate'])
- 身份屬性 id,name(web 定位)
- 複雜場景使用組合定位:
- xpath,css
- 屬性動态變化(id,text)
- 重複元素屬性(id,text,class)
- 父子定位(子定位父)
- js定位
Web 彈框定位
- 場景 web 頁面 alert 彈框
- 解決: web 需要使用 driver.switchTo().alert() 處理
下拉框/日期控件定位
- 場景: <input>标簽組合的下拉框無法定位 <input>标簽組合的日期控件無法定位
- 解決: 面對這些元素,我們可以引入 JS 注入技術來解決問題。
檔案上傳定位
- 場景: input 标簽檔案上傳
- 解決: input 标簽直接使用 send_keys()方法