目錄:
- Web自動化測試價值與體系
- 環境安裝與使用
- 自動化用例錄制
- 自動化測試用例結構分析
- web瀏覽器控制
- 常見控件定位方法
- 強制等待與隱式等待
- 常見控件交互方法
- 自動化測試定位策略
- 搜索功能自動化測試
- 用戶端Web自動化測試
1.Web自動化測試價值與體系
功能測試場景:
?UI 自動化測試場景:
?什么時候可以做UI自動化測試?
- 業務流程不頻繁改動
- UI 元素不頻繁改動
- 需要頻繁回歸的場景
- 核心場景等
?Web自動化測試相關技術:
- Selenium:支持多語言,行業內最火最主流
- Pytest/JUnit5:最好用最全面的單元測試框架
- Allure:測試報告
?Web自動化測試學習路線
2.環境安裝與使用
Selenium架構圖:
3.自動化用例錄制
SeleniumIDE用例錄制使用場景
- 剛開始入門UI自動化測試
- 團隊代碼基礎較差
- 技術成長之后學習價值不高
SeleniumIDE的下載以及安裝:
- 官網:https://www.selenium.dev/
- Chrome插件:https://chrome.google.com/webstore/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd
- Firefox插件:https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/
- github release:https://github.com/SeleniumHQ/selenium-ide/releases
- 其它版本:https://addons.mozilla.org/en-GB/firefox/addon/selenium-ide/versions/ 注意:Chrome插件在國內無法下載,Firefox可以直接下載。
?SeleniumIDE常用功能
- 新建、保存、打開
- 開始和停止錄制
- 運行8中的所有的實例
- 運行單個實例
- 調試模式
- 調整案例的運行速度
- 要錄制的網址
- 實例列表
- 動作、目標、值
- 對單條命令的解釋
- 運行日志
其他常用功能
- 用例管理
- 保存和回放
?SeleniumIDE腳本導出
- Java
- Python
4.自動化測試用例結構分析
標準的用例結構
- 用例標題
- 前提條件
- 用例步驟
- 預期結果
- 實際結果
自動化測試用例結構:
用例標題 | 測試包、文件、類、方法名稱 | 用例的唯一標識 |
前提條件 | setup、setup_class(Pytest); BeforeEach、BeforeAll(JUnit) | 測試用例前的準備動作,比如讀取數據或者driver的初始化 |
用例步驟 | 測試方法內的代碼邏輯 | 測試用例具體的步驟行為 |
預期結果 | assert 實際結果 = 預期結果 | 斷言,印證用例是否執行成功 |
實際結果 | assert 實際結果 = 預期結果 | 斷言,印證用例是否執行成功 |
后置動作 | teardown、teardown_class(Pytest); @AfterEach、@AfterAll(JUnit) | 臟數據清理、關閉driver進程 |
代碼示例:
import time
from selenium import webdriver
from selenium.webdriver.common.by import Byclass TestDemo01():def setup_method(self, method):# 實例化chromedriverself.driver = webdriver.Chrome()# 添加全局隱式等待self.driver.implicitly_wait(5)def teardown_method(self, method):# 關閉driverself.driver.quit()def test_demo01(self):# 訪問網站self.driver.get("https://www.baidu.com/")# 設置窗口self.driver.set_window_size(1330, 718)# 點擊輸入框self.driver.find_element(By.ID, "kw").click()# 輸入框輸入信息self.driver.find_element(By.ID, "kw").send_keys("斗破蒼穹")# 點擊搜索按鈕self.driver.find_element(By.ID, "su").click()# 等待界面加載time.sleep(5)# 元素定位后獲取文本信息res = self.driver.find_element(By.XPATH, '//*[@id="1"]/div/div[1]/h3/a[1]').text# 打印文本信息print(res)# 添加斷言assert "斗破蒼穹" in res# 查看界面展示time.sleep(5)
運行結果:
5.web瀏覽器控制
操作 | 使用場景 | |
---|---|---|
get | 打開瀏覽器 | web自動化測試第一步 |
refresh | 瀏覽器刷新 | 模擬瀏覽器刷新 |
back | 瀏覽器退回 | 模擬退回步驟 |
maximize_window | 最大化瀏覽器 | 模擬瀏覽器最大化 |
minimize_window | 最小化瀏覽器 | 模擬瀏覽器最小化 |
代碼示例:
from selenium import webdriver
import timeclass TestBrowserControl:def setup_method(self, method):# 實例化chromedriverself.driver = webdriver.Chrome()# 添加全局隱式等待self.driver.implicitly_wait(5)def teardown_method(self, method):# 關閉driverself.driver.quit()def test_open_web_page(self):# 打開網站self.driver.get('https://www.baidu.com/')# 等待一秒time.sleep(1)def test_refresh_web_page(self):# 打開網站self.driver.get('https://www.baidu.com/')# 等待一秒time.sleep(1)# 刷新網頁self.driver.refresh()time.sleep(1)def test_window_back(self):# 打開網站self.driver.get('https://www.baidu.com/')# 等待2秒time.sleep(2)self.driver.get('https://www.sougou.com/')# 等待2秒time.sleep(2)# 返回上一個界面self.driver.back()# 等待2秒time.sleep(2)def test_max_window(self):# 打開網站self.driver.get('https://www.baidu.com/')# 等待一秒time.sleep(1)# 屏幕最大化self.driver.maximize_window()# 等待一秒time.sleep(1)def test_min_window(self):# 打開網站self.driver.get('https://www.baidu.com/')# 等待一秒time.sleep(1)# 屏幕最小化self.driver.minimize_window()# 等待一秒time.sleep(1)
?瀏覽器操作總結
6.常見控件定位方法
方式 | 描述 |
---|---|
class name | class 屬性對應的值 |
css selector(重點) | css 表達式 |
id(重點) | id 屬性對應的值 |
name(重點) | name 屬性對應的值 |
link text | 查找其可見文本與搜索值匹配的錨元素 |
partial link text | 查找其可見文本包含搜索值的錨元素。如果多個元素匹配,則只會選擇第一個元素。 |
tag name | 標簽名稱 |
xpath(重點) | xpath表達式 |
代碼示例:
import time
from selenium import webdriverfrom selenium.webdriver.common.by import Byclass TestElementLocation:def setup_method(self, method):# 實例化chromedriverself.driver = webdriver.Chrome()# 添加全局隱式等待self.driver.implicitly_wait(5)def teardown_method(self, method):# 關閉driverself.driver.quit()# 通過id定位def test_id(self):# 打開網站self.driver.get('https://www.baidu.com/')# 等待一秒time.sleep(1)self.driver.find_element(By.ID, "s-usersetting-top").click()# 等待兩秒time.sleep(2)# name定位def test_name(self):# 打開網站self.driver.get('https://www.baidu.com')# 等待一秒time.sleep(1)self.driver.maximize_window()time.sleep(1)# 點擊更多self.driver.find_element(By.NAME, "tj_briicon").click()# 等待兩秒time.sleep(2)# css selector 定位def test_css_selector(self):# 打開網站self.driver.get('https://www.baidu.com')# 等待一秒time.sleep(1)self.driver.maximize_window()time.sleep(1)# 點擊圖片self.driver.find_element(By.CSS_SELECTOR, "#s-top-left > a:nth-child(6)").click()# 等待兩秒time.sleep(2)# xpath定位def test_xpath(self):# 打開網站self.driver.get('https://www.baidu.com')# 等待一秒time.sleep(1)self.driver.maximize_window()time.sleep(1)# 點擊圖片self.driver.find_element(By.XPATH, '//*[@id="s-top-left"]/a[6]').click()# 等待兩秒time.sleep(2)# link定位(1.一定是a標簽 2.輸入的元素為標簽內的文本)def test_link(self):# 打開網站self.driver.get('https://www.baidu.com')# 等待一秒time.sleep(1)self.driver.maximize_window()time.sleep(1)# 點擊圖片self.driver.find_element(By.LINK_TEXT, '圖片').click()# 等待兩秒time.sleep(2)# class_name 定位def test_class(self):pass# 使用tag_name定位元素def test_tag_name(self):pass# 使用partial_link_text定位元素def test_partial_link_text(self):pass
元素定位總結
7.強制等待與隱式等待
為什么要添加等待?
- 避免頁面未渲染完成后操作,導致的報錯
?代碼示例:
from selenium import webdriver
from selenium.webdriver.common.by import Byclass TestElementLocation:def setup_method(self, method):# 實例化chromedriverself.driver = webdriver.Chrome()# # 添加全局隱式等待# self.driver.implicitly_wait(5)def teardown_method(self, method):# 關閉driverself.driver.quit()def test_wait_sleep(self):self.driver.get("https://")# 不加等待,可能會因為網速等原因產生報錯self.driver.find_element(By.XPATH, "//*[text()='個人中心']")
?直接等待
- 解決方案:在報錯的元素操作之前添加等待
- 原理:強制等待,線程休眠一定時間
time.sleep(3)
import timefrom selenium import webdriver
from selenium.webdriver.common.by import Byclass TestElementLocation:def setup_method(self, method):# 實例化chromedriverself.driver = webdriver.Chrome()# # 添加全局隱式等待# self.driver.implicitly_wait(5)def teardown_method(self, method):# 關閉driverself.driver.quit()def test_wait_sleep(self):self.driver.get("https://")# 不加等待,可能會因為網速等原因產生報錯self.driver.find_element(By.XPATH, "//*[text()='個人中心']")def test_direct_wait(self):self.driver.get("https://")time.sleep(3)# 不加等待,可能會因為網速等原因產生報錯self.driver.find_element(By.XPATH, "//*[text()='個人中心']")
?隱式等待
- 問題:難以確定元素加載的具體等待時間。
- 解決方案:針對于尋找元素的這個動作,使用隱式等待添加配置。
- 原理:設置一個等待時間,輪詢查找(默認0.5秒)元素是否出現,如果沒出現就拋出異常
import timefrom selenium import webdriver
from selenium.webdriver.common.by import Byclass TestElementLocation:def setup_method(self, method):# 實例化chromedriverself.driver = webdriver.Chrome()# # 添加全局隱式等待# self.driver.implicitly_wait(5)def teardown_method(self, method):# 關閉driverself.driver.quit()def test_wait_sleep(self):self.driver.get("https://")# 不加等待,可能會因為網速等原因產生報錯self.driver.find_element(By.XPATH, "//*[text()='個人中心']")def test_direct_wait(self):self.driver.get("https://")time.sleep(3)# 不加等待,可能會因為網速等原因產生報錯self.driver.find_element(By.XPATH, "//*[text()='個人中心']")def test_implicit_wait(self):self.driver.get("https://")self.driver.implicitly_wait(5)# 不加等待,可能會因為網速等原因產生報錯self.driver.find_element(By.XPATH, "//*[text()='個人中心']")
?隱式等待無法解決的問題
- 元素可以找到,使用點擊等操作,出現報錯
- 原因:
- 頁面元素加載是異步加載過程,通常html會先加載完成,js、css其后
- 元素存在與否是由HTML決定,元素的交互是由css或者js決定
- 隱式等待只關注元素能不能找到,不關注元素能否點擊或者進行其他的交互
- 解決方案:使用顯式等待
顯式等待基本使用(初級):
- 示例:?
WebDriverWait(driver實例, 最長等待時間, 輪詢時間).until(結束條件)
- 原理:在最長等待時間內,輪詢,是否滿足結束條件
- 注意:在初級時期,先關注使用
import timefrom selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWaitclass TestElementLocation:def setup_method(self, method):# 實例化chromedriverself.driver = webdriver.Chrome()# # 添加全局隱式等待# self.driver.implicitly_wait(5)def teardown_method(self, method):# 關閉driverself.driver.quit()def test_wait_sleep(self):self.driver.get("https://")# 不加等待,可能會因為網速等原因產生報錯self.driver.find_element(By.XPATH, "//*[text()='個人中心']")def test_direct_wait(self):self.driver.get("https://")time.sleep(3)# 不加等待,可能會因為網速等原因產生報錯self.driver.find_element(By.XPATH, "//*[text()='個人中心']")def test_implicit_wait(self):self.driver.get("https://")self.driver.implicitly_wait(5)# 不加等待,可能會因為網速等原因產生報錯self.driver.find_element(By.XPATH, "//*[text()='個人中心']")def test_explicit_wait(self):self.driver = webdriver.Chrome()self.driver.get("https://")WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, '#success_btn')))self.driver.find_element(By.CSS_SELECTOR, "#success_btn").click()
總結
類型 | 使用方式 | 原理 | 適用場景 |
---|---|---|---|
直接等待 | time.sleep(等待時間)) | 強制線程等待 | 調試代碼,臨時性添加 |
隱式等待 | driver.implicitly_wait(等待時間) | 在時間范圍內,輪詢查找元素 | 解決找不到元素問題,無法解決交互問題 |
顯式等待 | WebDriverWait(driver實例, 最長等待時間, 輪詢時間).until(結束條件) | 設定特定的等待條件,輪詢操作 | 解決特定條件下的等待問題,比如點擊等交互性行為 |
?
8.常見控件交互方法
點擊,輸入,清空
-
點擊百度搜索框
-
輸入”三國殺,啟動!”
-
清空搜索框中信息
import timefrom selenium import webdriver
from selenium.webdriver.common.by import Byclass TestControl():def setup_method(self, method):# 實例化chromedriverself.driver = webdriver.Chrome()# 添加全局隱式等待self.driver.implicitly_wait(5)def teardown_method(self, method):# 關閉driverself.driver.quit()def test_click_send_clear(self):self.driver.get('https://www.baidu.com')# 點擊百度搜索框self.driver.find_element(By.ID, "kw").click()# 輸入"三國殺,啟動!"self.driver.find_element(By.ID, "kw").send_keys("三國殺,啟動!")time.sleep(2)# 清空搜索框中信息self.driver.find_element(By.ID, "kw").clear()time.sleep(2)
?獲取元素屬性信息
- 原因:
- 定位到元素后,獲取元素的文本信息,屬性信息等
- 目的:
- 根據這些信息進行斷言或者調試
獲取元素屬性信息的方法
- 獲取元素文本
- 獲取元素的屬性(html的屬性值)
?代碼示例:
import timefrom selenium import webdriver
from selenium.webdriver.common.by import Byclass TestControl():def setup_method(self, method):# 實例化chromedriverself.driver = webdriver.Chrome()# 添加全局隱式等待self.driver.implicitly_wait(5)def teardown_method(self, method):# 關閉driverself.driver.quit()def test_click_send_clear(self):self.driver.get('https://www.baidu.com')# 點擊百度搜索框self.driver.find_element(By.ID, "kw").click()# 輸入"三國殺,啟動!"self.driver.find_element(By.ID, "kw").send_keys("三國殺,啟動!")time.sleep(2)# 清空搜索框中信息self.driver.find_element(By.ID, "kw").clear()time.sleep(2)def test_get_element_attribute(self):self.driver.get('https://')# ** 元素的文本獲取result = self.driver.find_element(By.ID, 'locate_id').textprint(result)# # ** 元素的標簽獲取result = self.driver.find_element(By.ID, 'locate_id').tag_nameprint(result)# # ** 元素的屬性獲取result = self.driver.find_element(By.ID, 'locate_id').get_attribute('name')print(result)result = self.driver.find_element(By.ID, 'locate_id').get_attribute('class')print(result)result = self.driver.find_element(By.ID, 'locate_id').get_attribute('style')print(result)result = self.driver.find_element(By.ID, 'locate_id').get_attribute('id')print(result)
9.自動化測試定位策略
- 不知道應該使用哪種定位方式?
- 元素定位不到無法解決?
?通用 Web 定位方式
定位策略 | 描述 |
---|---|
class name | 通過 class 屬性定位元素 |
css selector | 通過匹配 css selector 定位元素 |
id | 通過 id 屬性匹配元素 |
name | 通過 name 屬性定位元素 |
link text | 通過?<a>text</a> ?標簽中間的 text 文本定位元素 |
partial link text | 通過?<a>text</a> ?標簽中間的 text 文本的部分內容定位元素 |
tag name | 通過 tag 名稱定位元素 |
xpath | 通過 xpath 表達式匹配元素 |
選擇定位器通用原則
- 與研發約定的屬性優先(class屬性:?
[name='locate']
) - 身份屬性 id,name(web 定位)
- 復雜場景使用組合定位:
- xpath,css
- 屬性動態變化(id,text)
- 重復元素屬性(id,text,class)
- 父子定位(子定位父)
- js定位
?Web 彈框定位
- 場景
- web 頁面 alert 彈框
- 解決:
- web 需要使用?
driver.switchTo().alert()
?處理
- web 需要使用?
下拉框/日期控件定位
-
場景:
<input>
標簽組合的下拉框無法定位<input>
標簽組合的日期控件無法定位
-
解決:
- 面對這些元素,我們可以引入 JS 注入技術來解決問題。
?文件上傳定位
- 場景:
- input 標簽文件上傳
- 解決:
- input 標簽直接使用 send_keys()方法
10.搜索功能自動化測試
測試用例:
用例標題 | 前提條件 | 用例步驟 | 預期結果 | 實際結果 |
---|---|---|---|---|
搜索功能 | 進入論壇首頁 | 1. 點擊搜索按鈕 2. 輸入搜索關鍵詞 3. 點擊搜索按鈕 | 1. 搜索成功 2. 搜索結果列表包含關鍵字 |
代碼示例:
import timefrom selenium import webdriver
from selenium.webdriver.common.by import Byclass TestForum():def setup_method(self, method):# 實例化chromedriverself.driver = webdriver.Chrome()# 添加全局隱式等待self.driver.implicitly_wait(5)def teardown_method(self, method):# 關閉driverself.driver.quit()# 動態元素的定位def test_dynamic_id(self):self.driver.get('https://')self.driver.find_element(By.CSS_SELECTOR, "[placeholder='搜索']").send_keys("appium")self.driver.find_element(By.CSS_SELECTOR, '.search-cta').click()time.sleep(2)web_element = self.driver.find_element(By.CSS_SELECTOR, ".topic-title")print(web_element.text)assert "appium" in web_element.text.lower()
例題:
1.以下關于css選擇器語法說明正確的是
?選項A:A:并集使用逗號:,?【正確答案】
?選項B:B:并集使用空格:
?選項C:C:并集使用大于號:>
?選項D:D:并集使用加號:+
正確答案: 選項A:A:并集使用逗號:,
逗號表示并集,空格是子孫,大于號是父子,加號是相鄰兄弟
2.下面關于selenium 說法,錯誤的是
選項A:A:selenium 根據網頁元素的屬性來定位元素
選項B:B:支持桌面應用軟件的自動化測試?【正確答案】
選項C:C:支持移動端網頁應用的自動化測試
選項D:D:支持web端頁面的UI自動化測試
正確答案: 選項B:B:支持桌面應用軟件的自動化測試
selenium 根據網頁元素的屬性來定位元素,支持移動端網頁應用的自動化測試,支持web端頁面的UI自動化測試不支持桌面應用軟件的自動化測試?
?3.Selenium定位中link定位適用于哪個標簽
?選項A:A:<div>標簽
?選項B:B:<span>標簽
?選項C:C:<a>標簽?【正確答案】
?選項D:D:<input>標簽
正確答案: 選項C:C:<a>標簽
link定位只針對于<a>標簽,其他標簽均無法使用
4.關于selenium 下面說法正確的是
?選項A:A:selenium 對web頁面有良好的支持?【正確答案】
?選項B:B:測試 Chrome/Firefox 瀏覽器,可以使用任意版本的 webdriver
?選項C:C:只有windows和mac可以安裝selenium
?選項D:D:selenium 只支持 java 和 python 語言
正確答案: 選項A:A:selenium 對web頁面有良好的支持
1、selenium 安裝方式 pip install selenium,
2、測試瀏覽器需要下載對應瀏覽器版本的webdriver,
3、selenium 支持多平臺windows,mac,linux,
4、selenium 支持多語言java,python, ruby等
?5.下面關于動態元素說法不正確的是
?選項A:A:元素的屬性會動態變化
?選項B:B:動態元素可以使用相對定位進行定位
?選項C:C:動態元素可以使用xpath 的軸定位方式進行元素定位
?選項D:D:動態元素必須使用絕對定位?【正確答案】
正確答案: 選項D:D:動態元素必須使用絕對定位
動態元素是元素的屬性會動態變化,可以通過遍歷的方式找到對應的的元素,動態元素可以使用xpath 的軸定位方式進行元素定位,動態元素不必須使用絕對定位,可以使用相對位置定位
6.web自動化中,通過下面哪種方法可以獲取元素的屬性信息
?選項A:A:java語法:getAttribute('屬性');python語法:get_attribute('屬性')?【正確答案】
?選項B:B:java語法:getElement('屬性');python語法:get_element('屬性')
?選項C:C:java語法:getAttributes('屬性');python語法:get_attributes('屬性')
?選項D:D:java語法:getElements('屬性');python語法:get_elements('屬性')
正確答案: 選項A:A:java語法:getAttribute('屬性');python語法:get_attribute('屬性')
java語法:getAttribute('屬性');python語法:get_attribute('屬性')可以獲取元素屬性信息,其他均無法拿到
7.xpath語法中,通過下標獲取最后一個元素正確的是
?選項A:A:[last()]?【正確答案】
?選項B:B:[-1]
?選項C:C:[first()]
?選項D:D:[last]
正確答案: 選項A:A:[last()]
last()可以獲取最后一個元素,下標里只能是正序,無法通過倒序-1獲取
8.判斷面上的元素是否成功展示,下面錯誤的說法
?選項A:A:當未找到元素時,添加捕獲異常的代碼塊
?選項B:B:使用elements 獲取一組元素,判斷元素組的長度
?選項C:C:使用顯式等待來判斷元素是否展示
?選項D:D:使用隱式等待來判斷元素是否展示?【正確答案】
正確答案: 選項D:D:使用隱式等待來判斷元素是否展示
使用隱式等待無法準確的判斷元素是否展示
9.如何定位頁面上動態加載的元素,下面解決方法正確的是
?選項A:A:使用查找元素的方法直接可以找到
?選項B:B:觸發動態事件,然后使用查找元素的方法
?選項C:C:使用隱式等待,然后使用查找元素的方法
?選項D:D:觸發動態事件,同時啟動隱式等待,然后使用查找元素的方法?【正確答案】
正確答案: 選項D:D:觸發動態事件,同時啟動隱式等待,然后使用查找元素的方法
定位頁面上動態加載的元素,需要在觸發動態事件,同時啟動隱式等待,然后使用查找元素的方法
10.web自動化中,高級控件交互ActionChains模擬回車的關鍵字是?
?選項A:A:SHIFT
?選項B:B:ENTER?【正確答案】
?選項C:C:CONTROL
?選項D:D:ALT
正確答案: 選項B:B:ENTER
鍵盤中ENTER為回車鍵,所以ActionChains模擬回車就使用ENTER關鍵字
11.關于xpath定位元素說法正確的是
?選項A:A:可以通過子元素定位父元素?【正確答案】
?選項B:B:不可以通過父元素定位子元素
?選項C:C:`.` 代表父結點
?選項D:D:`*`代表父結點
正確答案: 選項A:A:可以通過子元素定位父元素
xpath可以通過子元素定位到父元素
12.web自動化過程中,frame可以通過什么來定位然后進行切換
?選項A:A:index下標定位?【正確答案】
?選項B:B:id定位(id屬性存在)?【正確答案】
?選項C:C:name定位(name屬性存在)?【正確答案】
?選項D:D:css或xpath定位?【正確答案】
正確答案: 選項A:A:index下標定位,選項B:B:id定位(id屬性存在),選項C:C:name定位(name屬性存在),選項D:D:css或xpath定位
多frame切換時,可以使用下標,id,name和WebElement對象來定位
13.下面關于 selenium 說法正確的是:
?選項A:A:selenium 支持chrome,firefox等多瀏覽器?【正確答案】
?選項B:B:selenium 支持多平臺?【正確答案】
?選項C:C:selenium 可以作為瀏覽器兼容性測試的工具?【正確答案】
?選項D:D:selenium 支持分布式?【正確答案】
正確答案: 選項A:A:selenium 支持chrome,firefox等多瀏覽器,選項B:B:selenium 支持多平臺,選項C:C:selenium 可以作為瀏覽器兼容性測試的工具,選項D:D:selenium 支持分布式selenium 多瀏覽器處理,支持chrome,firefox等多瀏覽器,支持多平臺,可以作為瀏覽器兼容性測試的工具,selenium 支持分布式
14.適合做UI自動化測試的場景有哪些
?選項A:A:業務流程不頻繁改動?【正確答案】
?選項B:B:UI 元素不頻繁改動?【正確答案】
?選項C:C:需要頻繁回歸的場景?【正確答案】
?選項D:D:核心用例場景?【正確答案】
正確答案: 選項A:A:業務流程不頻繁改動,選項B:B:UI 元素不頻繁改動,選項C:C:需要頻繁回歸的場景,選項D:D:核心用例場景
ABCD均符合做UI自動化測試的場景
15.下面關于Selenium 定位正確的是
?選項A:A:通過css 定位可以通過父元素找子元素?【正確答案】
?選項B:B:通過css 定位可以通過子元素找父元素
?選項C:C:通過xpath 定位可以通過父元素找子元素?【正確答案】
?選項D:D:通過xpath 定位可以通過子元素找父元素?【正確答案】
正確答案: 選項D:D:通過xpath 定位可以通過子元素找父元素,選項A:A:通過css 定位可以通過父元素找子元素,選項C:C:通過xpath 定位可以通過父元素找子元素
通過xpath 定位可以通過父元素找子元素 通過xpath 定位可以通過子元素找父元素 通過css 定位可以通過父元素找子元素
16.用例在運行過程中經常會出現不穩定的情況,比如這次可以通過,下次就執行失敗,如何去提升用例的穩定性?
?選項A:A:多加強制等待
?選項B:B:用例中使用隱式等待或顯式等待?【正確答案】
?選項C:C:不使用絕對定位?【正確答案】
?選項D:D:以上都不正確得分:
正確答案: 選項B:B:用例中使用隱式等待或顯式等待,選項C:C:不使用絕對定位
隱式等待,用例在運行過程中經常會出現不穩定的情況,比如這次可以通過,下次就執行失敗,可以在創建完driver 之后設置 隱式等待,隱式等待是全局生效的。每次查找元素的時候都會動態的找到這個元素。使用相對定位可以提升用例穩定性
17.使用 css selector 定位時,當父標簽中有很多相同的子標簽時,通過索引找到所需要定位的元素,下面說法錯誤的是
?選項A:A:父標簽[父標簽屬性名=父標簽屬性值]>子標簽:nth-child(索引序號)
?選項B:B:父標簽[父標簽屬性名=父標簽屬性值]>子標簽:nth-child[索引序號]?【正確答案】
?選項C:C:索引號從1開始
?選項D:D:索引號從0開始?【正確答案】
正確答案: 選項B:B:父標簽[父標簽屬性名=父標簽屬性值]>子標簽:nth-child[索引序號],選項D:D:索引號從0開始表達式寫法:父標簽[父標簽屬性名=父標簽屬性值]>子標簽:nth-child(索引序號)?索引號從1開始?
18.webdriver 提供哪些常見類型的驅動程序
?選項A:A:FireFoxDriver(geckodriver)?【正確答案】
?選項B:B:InternetExploer Driver?【正確答案】
?選項C:C:ChromeDriver?【正確答案】
?選項D:D:Safari Driver?【正確答案】得分:
正確答案: 選項A:A:FireFoxDriver(geckodriver),選項B:B:InternetExploer Driver,選項C:C:ChromeDriver,選項D:D:Safari Driver
webdriver 提供的常見的驅動程序 有FireFoxDriver(geckodriver), InternetExploer Driver.? ?ChromeDriver.? Safari Driver等
19.selenium 可以模擬的操作,下面說法正確的
?選項A:A:點擊,輸入操作?【正確答案】
?選項B:B:滑動操作?【正確答案】
?選項C:C:拖拽操作?【正確答案】
?選項D:D:頁面滾動操作?【正確答案】
正確答案: 選項D:D:頁面滾動操作,選項A:A:點擊,輸入操作,選項B:B:滑動操作,選項C:C:拖拽操作元素操作,selenium 不可以模擬向頁面發送鼠標滾輪操作
20.關于 selenium 組件下面說法正確的是
?選項A:A:selenium 包括三大組件?【正確答案】
?選項B:B:selenium IDE 用于錄制回放腳本?【正確答案】
?選項C:C:selenium Grid 實現分布并發執行用例?【正確答案】
?選項D:D:selenium webdriver 負責自動化測試?【正確答案】
正確答案: 選項A:A:selenium 包括三大組件,選項B:B:selenium IDE 用于錄制回放腳本,選項C:C:selenium Grid 實現分布并發執行用例,選項D:D:selenium webdriver 負責自動化測試selenium 包括三大組件- selenium ?IDE 用于錄制回放腳本- selenium Grid 實現分布并發執行用例- selenium webdriver 負責自動化測試
11.用戶端Web自動化測試
需求:
- 要求實現搜索功能的Web自動化測試。
- Selenium 常用操作與用例編寫。
- 使用隱式等待優化代碼。
- 考慮特殊場景的驗證。
- 輸入內容過長。
- 特殊字符。
- 其他。
- 使用參數化優化代碼。
場景描述
-
打開測試人論壇。
-
跳轉到高級搜索頁面
-
搜索輸入框輸入搜索關鍵字。關鍵字清單如下:
Selenium Appium 面試
-
打印搜索結果的第一個標題。
-
斷言:第一個標題是否包含關鍵字。
?代碼示例:
test_search.py
import os
import timeimport pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWaitfrom web_automation_testing.test_search_ceshiren.utils.utils import Utilsdef get_datas(level):root_path = os.path.dirname(os.path.abspath(__file__))# print(root_path)yaml_path = os.sep.join([root_path, 'datas\\document\\search.yaml'])# print(yaml_path)yaml_datas = Utils.get_yaml_data(yaml_path)# print(yaml_datas)datas = yaml_datas.get('search').get(level).get('datas')return datasclass TestSearch():def setup_method(self, method):# 實例化chromedriverself.driver = webdriver.Chrome()# 添加全局隱式等待self.driver.implicitly_wait(5)def teardown_method(self, method):# 關閉driverself.driver.quit()@pytest.mark.parametrize('param', get_datas("P0"))def test_search(self, param):self.driver.get('https://ceshiren.com/search')input_field = self.driver.find_element(By.CSS_SELECTOR, "[placeholder='搜索']")input_field.send_keys(param)WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, '.search-cta')))search_button = self.driver.find_element(By.CSS_SELECTOR, '.search-cta')search_button.click()title_first = self.driver.find_element(By.CSS_SELECTOR, '.topic-title')print(title_first.text)assert param.lower() in title_first.text.lower()@pytest.mark.parametrize('param', get_datas("P1"))def test_search_the_input_is_too_long(self, param):self.driver.get('https://ceshiren.com/search')input_field = self.driver.find_element(By.CSS_SELECTOR, "[placeholder='搜索']")input_field.send_keys(param)WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, '.search-cta')))search_button = self.driver.find_element(By.CSS_SELECTOR, '.search-cta')search_button.click()time.sleep(2)title_first = self.driver.find_element(By.CSS_SELECTOR, '.no-results-suggestion')print(title_first.text)assert "找不到您要找的內容?" in title_first.text@pytest.mark.parametrize('param', get_datas("P2"))def test_search_special_characters(self, param):self.driver.get('https://ceshiren.com/search')input_field = self.driver.find_element(By.CSS_SELECTOR, "[placeholder='搜索']")input_field.send_keys(param)WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, '.search-cta')))search_button = self.driver.find_element(By.CSS_SELECTOR, '.search-cta')search_button.click()time.sleep(2)title_first = self.driver.find_element(By.CSS_SELECTOR, '.no-results-suggestion')print(title_first.text)assert "找不到您要找的內容?" in title_first.text
conftest.py
def pytest_collection_modifyitems(session, config, items: list):print(items)for item in items:item.name = item.name.encode('utf-8').decode('unicode-escape')item._nodeid = item.nodeid.encode('utf-8').decode('unicode-escape')
utils.py
import yamlclass Utils:@classmethoddef get_yaml_data(cls, yaml_path):'''讀取 yaml 文件數據:param yaml_path: yaml 文件路徑:return: 讀取到的數據'''with open(yaml_path, encoding="utf-8") as f:datas = yaml.safe_load(f)return datas
search.yaml
search:P0:datas:- 'Selenium'- 'Appium'- '面試'P1:datas:- 'f89465456ds4af894894654654894984fs8964f894a89s44f98d6sa4f84dsa98f4d9sa4fdsa4f5d6sa4f98d4f6a5s4df9684dsad89f4f4ds56f456sadf465as4df564asf65ds4af654dsa65f'P2:datas:- '/*--*/*-/-*/*-/-*/-*/-*/-*/*-/-*/-*/-*/-*/-*/++/-*/*-/-*/-+'
項目結構:
運行結果: