mobile自動化測試-appium webdriverio

? ?WebdriverIO是一款支持mobile app和mobile web自動化測試框架,與appium集成,完成對mobile應用測試。支持ios 和android兩種平臺,且功能豐富,是mobile app自動化測試首選框架。且官方還提供了mobile 應用測試example代碼,大大減少了從0構建移動應用自動化測試base code時間。

? ?如果搭建mobile app應用的UI自動化測試代碼,在選擇框架時需要考慮如下一些點框架是否支持

1.是否支持自動等待?自動等待可提升UI自動化測試穩定性

2.是否支持自動scroll element 到viewport中?如果不支持,UI自動化測試會很脆弱

3.是否支持上下,左右滑動

4.是否支持對目標元素進行拖動

5.是否支持錯誤截圖

6.定位頁面元素selector是否豐富

接下來看看webdriverio是否有上面的特性,以及如何實現上下的特性

WebdriverIO支持自動等待

? ?webdriverIO框架支持自動等待,框架有各種等待超時時間設置。例如可以在全局配置文件中,靈活設置連接appium server的超時時間(connectionRetryTimeout,connectionRetryCount),查找頁面元素超時時間(waitForSelectorTimeout)。除了全局設置,還可以手動設置超時時間,例如使用await element.waitForDisplayed({timeout: 1000})。通過這些超時時間,可以增加整個UI自動化測試穩定性。

WebdriverIO支持自動scroll element到viewport中

? 在查找元素的時候,如果元素不在viewport中,webdriverIO會自動向下滑動,直到找到目標元素。以Android為例,下面有三種寫法查找目標元素,如果目標元素不在viewport中,框架會自動向下滑動頁面,直到找到目標元素。因為三種方式都可以實現向下滑動,建議首選第一種,

//使用UiSelector()直接查找頁面元素,如果元素不存在,會默認向下滑動查找目標元素public async goToFirstPage() {const firstPageSelector = driver.isAndroid? 'android=new UiSelector().resourceId("com.binance.dev:id/2131435629")': '//XCUIElementTypeButton[@name="xx"]';await $(firstPageSelector).click()}
// 使用了UiScrollable,如果元素不存在,會默認向下滑動查找目標元素public async scrollDownToSymbol(symbol: string) {// UiScrollable默認是向下滾動,不會向上滾動const symbolSelector = driver.isAndroid? `android=new UiScrollable(new UiSelector().scrollable(true)).scrollIntoView(new UiSelector().text("${symbol}"))`: `//XCUIElementTypeStaticText[@name="${symbol}"]`;await $(symbolSelector).click()}// scrollIntoView默認也是向下滾動,不會向上滾動public async scrollIntoView(symbol: string) {const symbolSelector = driver.isAndroid? `android=new UiSelector().text("${symbol}")`: `//XCUIElementTypeStaticText[@name="${symbol}"]`;await $(symbolSelector).scrollIntoView()}

WebdriverIO如何支持上下、左右滑動

? 上面介紹了自動向下滑動,直到找到目標元素,在實際場景中,除了向下滑動,有時候需要向上滑動到界面頂部,或者向上滑動直到找到目標元素。另外,有時候還需要左右滑動,下面是具體實現的代碼。

//向上滑動
public async scrollUpToSymbol(symbol: string) {const topElementSelector = `new UiSelector().text("${symbol}")`;// 使用 mobile: scroll 支持up,down 滾動,不支持左右滾動await driver.execute('mobile: scroll', {strategy: '-android uiautomator',selector: topElementSelector,direction: 'up' // 指定滾動方向為向上});}
//向右滑動public async swipeRight() {const selector = driver.isAndroid? 'android=new UiSelector().resourceId("com.binance.dev:id/tabLayout")': '//XCUIElementTypeButton[@name="xx"]';const scrollableElement = $(selector)await driver.swipe({// swipe right,屏幕會顯示左邊的內容direction: "right",scrollableElement: scrollableElement,percent: 0.8,});}
//向左滑動public async swipeLeft() {const selector = driver.isAndroid? 'android=new UiSelector().resourceId("com.binance.dev:id/tabLayout")': '//XCUIElementTypeButton[@name="xx"]';const scrollableElement = $(selector)await driver.swipe({// swipe left,屏幕會顯示右邊的內容direction: "left",scrollableElement: scrollableElement,percent: 0.8,});}
}

WebdriverIO如何實現拖動目標元素

? 實際項目中,有些場景需要拖動目標元素到另外一個位置,某些應用的登錄頁面,可能就存在拖動的場景,下面是使用webdriverio實現拖動的code。dragAndDrop比較簡單,因為webdriverIO已經進行了封裝,直接調用即可。

it('should demonstrate the dragAndDrop command', async () => {const elem = $('#someElem')const target = $('#someTarget')// drag and drop to other elementawait elem.dragAndDrop(target)// drag and drop relative from current positionawait elem.dragAndDrop({ x: 100, y: 200 })
})

WebdriverIO如何支持錯誤截圖

? UI自動測試中,支持錯誤截圖是非常重要的功能,當有大量自動化case在流水線上每天運行時,維護成本是較大的,支持錯誤截圖可以幫助更快的判斷失敗case的原因,更快的進行修復。支持錯誤截圖非常簡單,在conf.ts文件中增加如下配置即可。即便是對原生app進行錯誤截圖,也適用browser.takeScreenshot()方法。

//在conf配置文件中增加如下的配置
afterTest: async function (test, context, { error, result, duration, passed, retries }) {if (!passed) {const screenshot = await browser.takeScreenshot();const fileName = `FAILED_${test.title.replace(/\s+/g, '_')}.png`;const filePath = path.join(process.cwd(), 'screenshots', fileName);// 確保目錄存在fs.mkdirSync(path.dirname(filePath), { recursive: true });// 保存截圖fs.writeFileSync(filePath, screenshot, 'base64');console.log(`Screenshot taken: ${filePath}`);}},

? webdriverio除了支持錯誤截圖,還支持視覺測試,視覺測試本質就是通過對比兩張截圖來驗證功能是否符合預期,如果某些應用頁面只讀信息比較多,那么可以采用這種方式來進行對比,不用手寫每個頁面元素進行對比,減少編寫代碼成本。

WebdriverIO支持哪些Selector

? ?對于Android應用,基本都采用UiAutomator2?Driver,下面列舉的selector都是UIAutomator2支持的selector,主要通過resourceId,text,className來定位,如果有多個元素,還可以通過.instance(index)來定位,或者先定位parent元素,再定位children元素。如果目標元素有content-des屬性,且該屬性值唯一,那么可以直接使用$('~content-desc')來定位。

    public async inputAmount(amount: string) {const amountInputSelector = driver.isAndroid ? 'android=new UiSelector().resourceId("com.binance.dev:id/2131441146")' : "";await $(amountInputSelector).setValue(amount)}public async viewAsset() {const holdingAssetMenu = driver.isAndroid ? 'android=new UiSelector().text("持有幣種")' : "";await $(holdingAssetMenu).click()}public async getPnlValue(index: number) {// 這里查找index=2的時候,沒有自動向下滑動,可以手動調用scrollIntoView的方法const parentSelector = driver.isAndroid ? `android=new UiSelector().resourceId("com.binance.dev:id/2131431738").instance(${index})` : "";const childSelector = driver.isAndroid ? 'android=new UiSelector().resourceId("com.binance.dev:id/tv_asset_daily_pnl_value")' : "";const pnl_value = await $(parentSelector).$(childSelector).getText()}const selector = 'new UiSelector().text("Cancel").className("android.widget.Button")'
const button = await $(`android=${selector}`)
await button.click()

? 對于IOS app,工具也支持多種元素定位方式,最常見的是如果目標元素有accessibility id,那么使用$('~accessibility id')定位,另外還可以通過-ios predicate string來定位目標元素。

const selector = `type == 'XCUIElementTypeSwitch' && name CONTAINS 'Allow'`
const switch = await $(`-ios predicate string:${selector}`)
await switch.click()const element = await $(`-ios predicate string:label == 'Login'`);const element = await $(`-ios predicate string:name BEGINSWITH 'Submit'`);const element = await $(`-ios predicate string:value > 10`);const element = await $(`-ios class chain:**/XCUIElementTypeCell[`name BEGINSWITH "A"`][-1]/XCUIElementTypeButton[10]`);

除此之外,webdriverio的還支持zoom,tap,swipe,longPress操作。例如,可以通過tap模擬點擊右鍵操作。

it('should be able to swipe right 3 times in a custom scroll areas to an element and tap on the element', async () => {const elem = $('~myElement')// Swipe right 3 times in the custom scrollable element to find the elementawait elem.tap({direction: 'right',maxScrolls: 3,scrollableElement: $('#scrollable')})
})

?除了常規的定位頁面元素,操作頁面元素外,webdriverio還支持視覺測試,即通過對比圖片來達到驗證的效果。如果某些app界面變化很小,那么可以采用視覺測試的方法,可有效降低編寫代碼的成本。

WebdriverIO視覺測試

?使用webdriverio開展視覺測試,首先需要在conf文件的services中進行如下配置,配置好后即可開始視覺測試,常用的方法就四個saveElement,checkElement,saveScreenshot,checkScreenshot。

["visual", {baselineFolder: path.join(process.cwd(), "virtual", "baseline"),formatImageName: "{tag}",screenshotPath: path.join(process.cwd(), "virtual", "tmp"),savePerInstance: true,autoSaveBaseline: true,blockOutStatusBar: true,blockOutToolBar: true,ignoreNothing: true,}]//通過saveElement對目標元素進行截圖存放到baseline中,再通過checkElement進行對比,如果對比不一致,會在diff文件中存放不一致的圖片public async saveScreenForNormalFeature() {const selector = driver.isAndroid? 'android=new UiSelector().resourceId("com.binance.dev:id/2131438006")': '//XCUIElementTypeButton[@name="xx"]';await browser.saveElement(await $(selector), "normalFeature", {enableLayoutTesting: true})}public async checkScreenshotNormalFeature() {const selector = driver.isAndroid? 'android=new UiSelector().resourceId("com.binance.dev:id/2131438006")': '//XCUIElementTypeButton[@name="xx"]';await browser.checkElement(await $(selector), "normalFeature", {enableLayoutTesting: true})}

運行測試后,會自動創建響應的目錄,并將目標元素截圖存放到對應folder中。

以上就是對webdriverio工具的總體介紹。

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

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

相關文章

Kubernetes排錯(十):常見網絡故障排查

通用排查思路 Kubernetes 集群內不同服務之間的網絡通信出現異常,表現為請求超時、連接失敗或響應緩慢,導致服務間依賴關系中斷,依賴服務的功能不可用或性能下降,甚至可能波及整個微服務架構,引發連鎖反應&#xff0c…

PyTorch 張量與自動微分操作

筆記 1 張量索引操作 import torch ? # 下標從左到右從0開始(0->第一個值), 從右到左從-1開始 # data[行下標, 列下標] # data[0軸下標, 1軸下標, 2軸下標] ? def dm01():# 創建張量torch.manual_seed(0)data torch.randint(low0, high10, size(4, 5))print(data->,…

接口的基礎定義與屬性約束

在 TypeScript 中,接口(Interface)是一個非常強大且常用的特性。接口定義了對象的結構,包括對象的屬性和方法,可以為對象提供類型檢查和約束。通過接口,我們可以清晰地描述一個對象應該具備哪些屬性和方法。…

高效全能PDF工具,支持OCR識別

軟件介紹 PDF XChange Editor是一款功能強大的PDF編輯工具,支持多種操作功能,不僅可編輯PDF內容與圖片,還具備OCR識別表單信息的能力,滿足多種場景下的需求。 軟件特點 這款PDF編輯器完全免費,用戶下載后直接…

OpenCV 中用于背景分割的一個類cv::bgsegm::BackgroundSubtractorGMG

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 cv::bgsegm::BackgroundSubtractorGMG 是 OpenCV 中用于背景分割的一個類,它實現了基于貝葉斯推理的背景建模算法(Bayesi…

MongoDB知識框架

簡介:MongoDB 是一個基于分布式文件存儲的數據庫,屬于 NoSQL 數據庫產品,以下是其知識框架總結: 一、數據模型 文檔:MongoDB 中的數據以 BSON(二進制形式的 JSON)格式存儲在集合中,…

WEBSTORM前端 —— 第2章:CSS —— 第8節:網頁制作2(小兔鮮兒)

目錄 1.項目目錄 2.SEO 三大標簽 3.Favicon 圖標 4.版心 5.快捷導航(shortcut) 6.頭部(header) 7.底部(footer) 8.banner 9.banner – 圓點 10.新鮮好物(goods) 11.熱門品牌(brand) 12.生鮮(fresh) 13.最新專題(topic) 1.項目目錄 【xtx-pc】 ima…

1、RocketMQ 核心架構拆解

1. 為什么要使用消息隊列? 消息隊列(MQ)是分布式系統中不可或缺的中間件,主要解決系統間的解耦、異步和削峰填谷問題。 解耦:生產者和消費者通過消息隊列通信,彼此無需直接依賴,極大提升系統靈…

[Linux網絡_71] NAT技術 | 正反代理 | 網絡協議總結 | 五種IO模型

目錄 1.NAT技術 NAPT 2.NAT和代理服務器 3.網線通信各層協議總結 補充說明 4.五種 IO 模型 1.什么是IO?什么是高效的IO? 2.有那些IO的方式?這么多的方式,有那些是高效的? 異步 IO 🎣 關鍵缺陷類比…

Unity基礎學習(八)時間相關內容Time

眾所周知,每一個游戲都會有自己的時間。這個時間可以是內部,從游戲開始的時間,也可以是外部真實的物理時間,時間相關內容 主要用于游戲中 參與位移計時 時間暫停等。那么我們今天就來看看Unity中和時間相關的內容。 Unity時間功能…

Java游戲服務器開發流水賬(1)游戲服務器的架構淺析

新項目立項停滯,頭大。近期讀老項目代碼看到Java,筆記記錄一下。 為什么要做服務器的架構 游戲服務器架構設計具有多方面的重要意義,它直接關系到游戲的性能、可擴展性、穩定性以及用戶體驗等關鍵因素 確保游戲的流暢運行 優化數據處理&a…

計算機視覺與深度學習 | 基于Transformer的低照度圖像增強技術

基于Transformer的低照度圖像增強技術通過結合Transformer的全局建模能力和傳統圖像增強理論(如Retinex),在保留顏色信息、抑制噪聲和平衡亮度方面展現出顯著優勢。以下是其核心原理、關鍵公式及典型代碼實現: 一、原理分析 1. 全局依賴建模與局部特征融合 Transformer的核…

Linux 文件目錄管理常用命令

pwd 顯示當前絕對路徑 cd 切換目錄 指令備注cd -回退cd …返回上一層cd ~切換到用戶主目錄 ls 列出目錄的內容 指令備注ls -a顯示當前目錄中的所有文件和目錄,包括隱藏文件ls -l以長格式顯示當前目錄中的文件和目錄ls -hl以人類可讀的方式顯示當前目錄中的文…

【Linux 系統調試】性能分析工具perf使用與調試方法

目錄 一、perf基本概念 1?. 事件類型? 2?. 低開銷高精度 3?. 工具定位? 二、安裝與基礎配置 1. 安裝方法 2. 啟用符號調試 三、perf工作原理 1. 數據采集機制 2. 硬件事件轉化流程 四、perf應用場景 1. 系統瓶頸定位 2. 鎖競爭優化 3. 緩存優化 五、perf高級…

嵌入式中屏幕的通信方式

LCD屏通信方式詳解 LCD屏(液晶顯示屏)的通信方式直接影響其數據傳輸效率、顯示刷新速度及硬件設計復雜度。根據應用場景和需求,LCD屏的通信方式主要分為以下三類,每種方式在協議類型、數據速率、硬件成本及適用場景上存在顯著差異…

【el-admin】el-admin關聯數據字典

數據字典使用 一、新增數據字典1、新增【圖書狀態】和【圖書類型】數據字典2、編輯字典值 二、代碼生成配置1、表單設置2、關聯字典3、驗證關聯數據字典 三、查詢操作1、模糊查詢2、按類別查詢(下拉框) 四、數據校驗 一、新增數據字典 1、新增【圖書狀態…

【Spring】Spring MVC筆記

文章目錄 一、SpringMVC簡介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特點 二、HelloWorld1、開發環境2、創建maven工程a>添加web模塊b>打包方式:warc>引入依賴 3、配置web.xmla>默認配置方式b>擴展配置方式 4、創建請求控制器5、創建springMVC…

如何在大型項目中解決 VsCode 語言服務器崩潰的問題

在大型C/C項目中,VS Code的語言服務器(如C/C擴展)可能因內存不足或配置不當頻繁崩潰。本文結合系統資源分析與實戰技巧,提供一套完整的解決方案。 一、問題根源診斷 1.1 內存瓶頸分析 通過top命令查看系統資源使用情況&#xff…

LeetCode百題刷002摩爾投票法

遇到的問題都有解決的方案,希望我的博客可以為你提供一些幫助 圖片源自leetcode 題目:169. 多數元素 - 力扣(LeetCode) 一、排序法 題目要求需要找到多數值(元素個數>n/2)并返回這個值。一般會想到先…

Android Studio Gradle 中 只顯示 Tasks 中沒有 build 選項解決辦法

一、問題描述 想把項目中某一個模塊的代碼單獨打包成 aar ,之前是點擊 AndroidStudio 右側的 Gradle 選項,然后再點擊需要打包的模塊找到 build 進行打包,但是卻發現沒有 build 選項。 二、解決辦法 1、設置中勾選 Configure all Gradle tasks… 選項 …