用戶端Web自動化測試-L1

目錄:

  1. Web自動化測試價值與體系
  2. 環境安裝與使用
  3. 自動化用例錄制
  4. 自動化測試用例結構分析
  5. web瀏覽器控制
  6. 常見控件定位方法
  7. 強制等待與隱式等待
  8. 常見控件交互方法
  9. 自動化測試定位策略
  10. 搜索功能自動化測試
  11. 用戶端Web自動化測試

1.Web自動化測試價值與體系

功能測試場景:

PlantUML diagram

?UI 自動化測試場景:

PlantUML diagram

?什么時候可以做UI自動化測試?

  • 業務流程不頻繁改動
  • UI 元素不頻繁改動
  • 需要頻繁回歸的場景
  • 核心場景等

?Web自動化測試相關技術:

  • Selenium:支持多語言,行業內最火最主流
  • Pytest/JUnit5:最好用最全面的單元測試框架
  • Allure:測試報告

?Web自動化測試學習路線

PlantUML diagram

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常用功能

  1. 新建、保存、打開
  2. 開始和停止錄制
  3. 運行8中的所有的實例
  4. 運行單個實例
  5. 調試模式
  6. 調整案例的運行速度
  7. 要錄制的網址
  8. 實例列表
  9. 動作、目標、值
  10. 對單條命令的解釋
  11. 運行日志

其他常用功能

  • 用例管理
  • 保存和回放

?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)

?瀏覽器操作總結

PlantUML diagram

6.常見控件定位方法

方式描述
class nameclass 屬性對應的值
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

元素定位總結

PlantUML diagram

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(結束條件)設定特定的等待條件,輪詢操作解決特定條件下的等待問題,比如點擊等交互性行為

?

PlantUML diagram

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.自動化測試定位策略

  • 不知道應該使用哪種定位方式?
  • 元素定位不到無法解決?

PlantUML diagram

?通用 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 表達式匹配元素

選擇定位器通用原則

  1. 與研發約定的屬性優先(class屬性:?[name='locate'])
  2. 身份屬性 id,name(web 定位)
  3. 復雜場景使用組合定位:
    • xpath,css
    • 屬性動態變化(id,text)
    • 重復元素屬性(id,text,class)
    • 父子定位(子定位父)
  4. js定位

?Web 彈框定位

  • 場景
    • web 頁面 alert 彈框
  • 解決:
    • web 需要使用?driver.switchTo().alert()?處理

下拉框/日期控件定位

  • 場景:

    • <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自動化測試

需求:

  1. 要求實現搜索功能的Web自動化測試。
  2. Selenium 常用操作與用例編寫。
  3. 使用隱式等待優化代碼。
  4. 考慮特殊場景的驗證。
    • 輸入內容過長。
    • 特殊字符。
    • 其他。
  5. 使用參數化優化代碼。

場景描述

  1. 打開測試人論壇。

  2. 跳轉到高級搜索頁面

  3. 搜索輸入框輸入搜索關鍵字。關鍵字清單如下:

    Selenium
    Appium
    面試
  4. 打印搜索結果的第一個標題。

  5. 斷言:第一個標題是否包含關鍵字。

?代碼示例:

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:- '/*--*/*-/-*/*-/-*/-*/-*/-*/*-/-*/-*/-*/-*/-*/++/-*/*-/-*/-+'

項目結構:

運行結果:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36084.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36084.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36084.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IntelliJ Idea 編譯時控制臺上中文輸出亂碼

猜測原因是IDEA啟動時未指定編碼信息&#xff0c;故與系統編碼保持一致&#xff08;windows中文系統默認為GBK編碼&#xff09;,當以UTF-8編碼進行編譯在控制臺會以GBK編碼輸出,從而導致亂碼 解決方案 指定Idea啟動時JVM的默認編碼為UTF-8 Help -> Edit Custom Options P…

本地圖片的image加密解密-Python 3.10-win10

本地圖片的image加密解密- Python 3.10 pyt3int22 -根據1zip下圖片批量生成加密的-物體識別.py import ioimport os import base64 import json # 指定圖片文件夾 image_dir = "./1zip/" base64code_dir = "./base64code/" base64_to_dir = "./bas…

AUTOSAR規范與ECU軟件開發(基礎篇)2.5 AUTOSAR方法論

前言 AUTOSAR方法論(AUTOSAR Methodology) 中車用控制器軟件的開發涉及系統級、 ECU級和軟件組件級。 系統級主要考慮系統功能需求、 硬件資源、 系統約束, 然后建立系統架構; ECU級根據抽象后的信息對ECU進行配置; 系統級和ECU級設計的同時, 伴隨著軟件組件級的開發。 上…

Sql server還原失敗(數據庫正在使用,無法獲得對數據庫的獨占訪問權)

一.Sql server還原失敗(數據庫正在使用,無法獲得對數據庫的獨占訪問權) 本次測試使用數據庫實例SqlServer2008r2版 錯誤詳細&#xff1a; 標題: Microsoft SQL Server Management Studio ------------------------------ 還原數據庫“Mvc_HNHZ”時失敗。 (Microsoft.SqlServer.…

《甲午》觀后感——GPT-3.5所寫

《甲午》是一部令人深思的紀錄片&#xff0c;通過生動的畫面和真實的故事&#xff0c;向觀眾展示了中國歷史上的一段重要時期。觀看這部紀錄片&#xff0c;我深受觸動&#xff0c;對歷史的認識也得到了深化。 首先&#xff0c;這部紀錄片通過精心搜集的歷史資料和珍貴的影像資料…

低成本搭建NAS,利用HFS進行內網穿透,實現公網訪問

通過HFS低成本搭建NAS&#xff0c;并內網穿透實現公網訪問 文章目錄 通過HFS低成本搭建NAS&#xff0c;并內網穿透實現公網訪問前言1.下載安裝cpolar1.1 設置HFS訪客1.2 虛擬文件系統 2. 使用cpolar建立一條內網穿透數據隧道2.1 保留隧道2.2 隧道名稱2.3 成功使用cpolar創建二級…

JMS 消息隊列接口基本使用指南

概述 介紹 JMS&#xff08;Java Message Service&#xff09;即 Java 消息服務應用程序接口&#xff0c;是一個 Java 平臺中關于面向消息中間件&#xff08;MOM&#xff09;的 API&#xff0c;用于在兩個應用程序之間&#xff0c;或分布式系統中發送消息&#xff0c;進行異步…

[保研/考研機試] KY103 2的冪次方 上海交通大學復試上機題 C++實現

題目鏈接&#xff1a; KY103 2的冪次方 https://www.nowcoder.com/share/jump/437195121691999575955 描述 Every positive number can be presented by the exponential form.For example, 137 2^7 2^3 2^0。 Lets present a^b by the form a(b).Then 137 is present…

k8s containerd 配置 http訪問harbor image【最新--官方文檔】

不看官方文檔的代價&#xff1a;在搜索了很多中文資料發現配置了都不起作用&#xff0c;浪費了很多時間。 https://github.com/containerd/containerd/blob/main/docs/cri/config.md#registry-configuration The old CRI config pattern for specifying registry.mirrors and…

MySQL8安裝和刪除教程 保姆級(Windows)

下載 官網: mysql官網點擊Downloads->MySQL Community(GPL) Downloads->MySQL Community Server(或者點擊MySQL installer for Windows) Windows下有兩種安裝方式 在線安裝 一般帶有 web字樣 這個需要聯網離線安裝 一般沒有web字樣 安裝 下載好之后,版本號可以不一樣&…

Postman中,既想傳遞文件,還想傳遞多個參數(后端)

需求:既想傳文件又想傳多個參數可以用以下方式實現

Django rest_framework Serializer中的create、Views中的create/perform_create的區別

Django rest_framework Serializer中的create、Views中的create/perform_create的區別 對于后端來說&#xff0c;前后端分離的方式能讓前后端的開發都爽。和所有的爽一樣&#xff0c;每爽一次都要付出一定的代價。而前后端分離的代價&#xff0c;就是后端要面對巨量的模塊化的功…

C語言實現插入排序

什么是插入排序&#xff1f; 插入排序&#xff08;Insertion Sort&#xff09; 是一種簡單且逐步構建有序序列的排序算法。它的思想是將數組分為兩部分&#xff1a;已排序的部分和未排序的部分。初始時&#xff0c;已排序部分只包含數組的第一個元素&#xff0c;然后逐步將未排…

Process.Start 報錯

Process.Start 報錯 System.Diagnostics.Process.StartWithShellExecuteEx Process.Start 為什么會引發“系統找不到指定的文件”異常 Process.Start 報錯 找不到路徑 ,System.ComponentModel.Win32Exception:“系統找不到指定的文件。 問題1、 在WinForm中可能是權限問題&…

做了這件事,精準拿捏企業資產管理!

資產管理系統是一種為組織和個人提供管理各類資產的重要工具。無論是金融資產還是實物資產&#xff0c;這些都構成了一個實體或個人財務狀況的重要組成部分。 無論是企業尋求優化其固定資產維護&#xff0c;還是個人希望更好地管理他們的投資組合&#xff0c;資產管理系統在現代…

NZ系列工具NZ02:VBA讀取PDF使用說明

【分享成果&#xff0c;隨喜正能量】時光綻放并蒂蓮&#xff0c;更是一份殷殷囑托&#xff0c;更是一份誠摯祝福&#xff0c;是一份時光饋贈&#xff0c;又是一份時光陪伴。。 我的教程一共九套及VBA漢英手冊一部&#xff0c;分為初級、中級、高級三大部分。是對VBA的系統講解…

“深入解析JVM:探索Java虛擬機的工作原理與優化技巧“

標題&#xff1a;深入解析JVM&#xff1a;探索Java虛擬機的工作原理與優化技巧 摘要&#xff1a;本文將深入探討Java虛擬機&#xff08;JVM&#xff09;的工作原理、內部結構以及如何優化Java應用程序的性能。我們將介紹JVM的主要組件&#xff0c;包括類加載器、運行時數據區域…

關于openssl SM2 ECC以及密鑰生成和簽名驗簽

SM2是基于ECC的國密算法,本身也是ECC算法。 openssl生成ECC公私鑰并簽名驗簽 #!/bin/sh openssl ecparam -genkey -name prime256v1 -out private.pem #print pri #openssl ec -in private.pem -text -noout openssl ec -in private.pem -pubout -out public.pem #gen test.…

uniapp+uview封裝小程序請求

提要&#xff1a; uniapp項目引入uview庫 此步驟不再闡述 1.創建環境文件 env.js&#xff1a; let BASE_URL;if (process.env.NODE_ENV development) {// 開發環境BASE_URL 請求地址; } else {// 生產環境BASE_URL 請求地址; }export default BASE_URL; 2.創建請求文件 該…

QLExpress動態腳本引擎解析工具

介紹 QLExpress腳本引擎 1、線程安全&#xff0c;引擎運算過程中的產生的臨時變量都是threadlocal類型。 2、高效執行&#xff0c;比較耗時的腳本編譯過程可以緩存在本地機器&#xff0c;運行時的臨時變量創建采用了緩沖池的技術&#xff0c;和groovy性能相當。 3、弱類型腳本…