当前位置: 首页>编程笔记>正文

ui自動化測試工具,移動端UI自動化之appium的使用(二)

ui自動化測試工具,移動端UI自動化之appium的使用(二)

一、appium屬性獲取與斷言

1.1、get_attrbute原理分析

官網:https://appium.io/docs/en/commands/element/attributes/attribute/

所有可以獲取的屬性

CHECKABLE(new String[]{"checkable"}),
CHECKED(new String[]{"checked"}),
CLASS(new String[]{"class", "className"}),
CLICKABLE(new String[]{"clickable"}),
CONTENT_DESC(new String[]{"content-desc", "contentDescription"}),
ENABLED(new String[]{"enabled"}),
FOCUSABLE(new String[]{"focusable"}),
FOCUSED(new String[]{"focused"}),
LONG_CLICKABLE(new String[]{"long-clickable", "longClickable"}),
PACKAGE(new String[]{"package"}),
PASSWORD(new String[]{"password"}),
RESOURCE_ID(new String[]{"resource-id", "resourceId"}),
SCROLLABLE(new String[]{"scrollable"}),
SELECTION_START(new String[]{"selection-start"}),
SELECTION_END(new String[]{"selection-end"}),
SELECTED(new String[]{"selected"}),
TEXT(new String[]{"text", "name"}),
// The main difference of this attribute from the preceding one is that
// it does not replace null values with empty strings
ORIGINAL_TEXT(new String[]{"original-text"}, false, false),
BOUNDS(new String[]{"bounds"}),
INDEX(new String[]{"index"}, false, true),
DISPLAYED(new String[]{"displayed"}),
CONTENT_SIZE(new String[]{"contentSize"}, true, false);
def test_get_attr(self):"""獲取屬性"""search_ele = self.driver.find_element_by_id('com.xueqiu.android:id/tv_search')print(search_ele.get_attribute('content-desc'))print(search_ele.get_attribute('text'))print(search_ele.get_attribute('resource-id'))print(search_ele.get_attribute('clickable'))print(search_ele.get_attribute('enabled'))print(search_ele.get_attribute('bounds'))

1.2、斷言

1.2.1、普通斷言 assert

如果存在兩個assert,則第一個assert斷言失敗,就不會執行第二個斷言。

1.2.2、Hamcrest斷言

github地址:https://github.com/hamcrest/PyHamcrest

安裝:pip install PyHamcrest

ui自動化測試工具。hamcrest 框架介紹

  • Hamcrest是一個為了測試為目的,能組合成靈活表達式的匹配器類庫。用于編寫斷言的框架,使用這個框架編寫斷言,提高可讀性及開發測試的效率。
  • Hamcrest提供了大量被稱為“匹配器”的方法。每個匹配器都設計用于執行特定的比較操作。
  • Hamcrest的可擴展性強,讓你能夠創建自定義的匹配器。
def test_hamcrest(self):"""hamcrest斷言"""assert_that(10, equal_to(10))assert_that(10.0, close_to(10.0, 0.25))

二、appium參數化用例

雪球app下載,提取碼:cd8v

import pytest
from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy
from hamcrest import *class TestParam:def setup(self):des_caps = {'platformName': 'Android','platformVersion': '7.1.2','deviceName': '127.0.0.1:62001','appPackage': 'com.xueqiu.android','appActivity': '.common.MainActivity','unicodeKeyboard': True,'resetKeyboard': True,'noReset': True,'dontStopAppOnReset': True,'skipDeviceInitialization': True}self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des_caps)self.driver.implicitly_wait(10)def teardown(self):# 點擊取消self.driver.find_element(MobileBy.ID, 'com.xueqiu.android:id/action_close').click()self.driver.quit()@pytest.mark.parametrize('name, code, expect', [('阿里巴巴', 'BABA', 230),('小米集團', '01810', 27)])def test_param(self, name, code, expect):"""參數化1、打開 雪球 app2、點擊搜索輸入框3、向搜索框里面輸入搜索詞4、在搜索結果里面選擇第一個搜索結果,然后進行點擊5、獲取股價,并判斷這只股價的價格:return:"""self.driver.find_element(MobileBy.ID, 'com.xueqiu.android:id/tv_search').click()self.driver.find_element(MobileBy.ID, 'com.xueqiu.android:id/search_input_text').send_keys(name)self.driver.find_element(MobileBy.ID, 'com.xueqiu.android:id/name').click()current_price = self.driver.find_element(MobileBy.XPATH,f'//*[@text="{code}"]/../../..'f'//*[@resource-id="com.xueqiu.android:id/current_price"]').textcurrent_price = float(current_price)print(current_price)assert_that(current_price, close_to(expect, 10))

三、Android webview測試

appium支持 Native App(原生)、Hybrid App(混合)、Web App(H5)三種應用。

上下文
原生:NATIVE_APP
H5: WEBVIEW_xxx

3.1、環境準備

手機端:被測瀏覽器(不可以是第三方瀏覽器,一般使用自帶的瀏覽器),IOS:Safari、Chrome,Android:Chromium,Browser

PC端:安裝Chrome瀏覽器(或chromium),并且能登錄https://www.google.com/

下載對應手機瀏覽器對應的driver版本:

  • 國內鏡像地址:https://npm.taobao.org/mirrors/chromedriver/
  • appium github:https://github.com/appium/appium/blob/master/docs/cn/writing-running-appium/web/chromedriver.md

react native ui,獲取手機默認瀏覽器的版本:

mac/linux 只需要把findstr改成grep即可

C:\Users\18367>adb shell pm list package |findstr webview  <== 獲取webview的包名
package:com.google.android.webviewC:\Users\18367>adb shell pm dump com.google.android.webview |findstr version  <== 默認瀏覽器的版本versionCode=377014315 minSdk=0 targetSdk=29versionName=75.0.3770.143  <== 默認瀏覽器的版本

下載最接近的驅動版本,這個版本是支持75版本的。

在這里插入圖片描述

啟動參數

appium默認有個驅動版本,但是和手機或者模擬器版本不匹配,需要通過chromedriverExecutable參數指定對應的驅動。

'browserName'='Browser' 或者 'browserName'='Chrome'
'chromedriverExecutable'='指定驅動路徑'

3.2、元素定位

appium和uiautomator的區別,使用谷歌瀏覽器需要科學上網什么的,比較麻煩,建議可以使用最新版本的edge瀏覽器。

edge瀏覽器中輸入edge://inspect,點擊對應的網頁的inspect,進入調試模式,查找元素定位。

在這里插入圖片描述

在這里插入圖片描述

from os.path import dirname, joinfrom appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from time import sleepfrom appium import webdriverclass TestBrowser:def setup(self):des_caps = {'platformName': 'Android','platformVersion': '7.1.2','deviceName': '127.0.0.1:62001','browserName': 'Browser','chromedriverExecutable': join(dirname(__file__), 'driver', 'chromedriver.exe'),'noReset': True,}self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des_caps)self.driver.implicitly_wait(10)def teardown(self):self.driver.quit()def test_browser(self):self.driver.get('https://m.baidu.com/')sleep(5)self.driver.find_element(MobileBy.ID, 'index-kw').click()WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((MobileBy.ID, 'index-kw'))).send_keys('appium')WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((MobileBy.ID, 'index-bn'))).click()sleep(5)

3.3、Android混合頁面測試

混合應用就是在原生的頁面中嵌入了H5頁面。

如何判斷頁面是webview

  1. 斷網查看
  2. 看加載條
  3. 看頂部是否有關閉按鈕
  4. 下拉刷新,頁面是否刷新
  5. 下拉刷新的時候是否有網頁提供方
  6. 用工具查看

蘋果ui自動化是什么、webview

  • android系統提供能顯示網頁的系統控件(特殊的view)
  • <Android 4.4 WebView底層實現WebKit內核
  • =Android 4.4 Google采用chromium作為系統WebView底層支持,API沒變,支持H5、CSS3、js

前提條件

PC

  1. 瀏覽器能訪問:https://www.google.com/,edge瀏覽器也可以定位原生
  2. chromedriver下載對應的版本

手機端:應用app需要打開webview開關,android 6.0 不開啟webview也可以獲取html結構

代碼

  1. appPackage,appActivity
  2. 啟動參數里面添加:chromedriverExecutable參數,指定驅動的版本的路徑

appium中文官網、通過appium日志查看Chromedriver日志,查看手機內置瀏覽器的chrome版本。
在這里插入圖片描述
示例

from os.path import join, dirname
from time import sleepfrom appium import webdriver
from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECclass TestWebView:def setup(self):des_caps = {'platformName': 'Android','platformVersion': '7.1.2','deviceName': '127.0.0.1:62001','udid': '127.0.0.1:62001','appPackage': 'com.xueqiu.android','appActivity': '.common.MainActivity','chromedriverExecutable': join(dirname(__file__), 'driver', 'chromedriver224.exe'),'unicodeKeyboard': True,'resetKeyboard': True,'noReset': True,'dontStopAppOnReset': True,'skipDeviceInitialization': True}self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des_caps)self.driver.implicitly_wait(10)def teardown(self):self.driver.quit()def test_webview(self):""":return:"""self.driver.find_element(MobileBy.XPATH, '//*[@text="交易"]').click()# 切換上下文self.driver.switch_to.context(self.driver.contexts[-1])print(self.driver.page_source)# 進入港美股開戶頁面WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((MobileBy.XPATH, '//*[@text()="港美股開戶"]'))).click()# 切換句柄,每打開一個網頁,就會有一個新的句柄self.driver.switch_to.window(self.driver.window_handles[-1])WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((MobileBy.XPATH, '//*[text()="請輸入手機號"]'))).send_keys('13000000000')self.driver.find_element(MobileBy.XPATH, '//*[text()="請輸入驗證碼"').send_keys('1234')self.driver.find_element(MobileBy.XPATH, '//*[text()="立即開戶"').send_keys('1234')

常遇到的坑

設備

  • android模擬器6.0默認支持webview操作(mumu不可以,genimotion和sdk自帶的emulator可以)
  • 其它模擬器和物理機需要打開app內開關(webview調試開關)

PC瀏覽器定位元素

  • chrome瀏覽器-Chrome 62 才可以更好的看見webview的內部,其它版本都有bug
  • 也換成chromeium瀏覽器可以避免很多坑,展示效果和速度都比chrome要快

代碼

  • 有的設備可以直接使用find_element_by_accessibility_id(),不同的設備渲染的頁面不同,兼容性不適合
  • switch_to.context():切換上下文
  • switch_to.window():切換句柄

多版本的驅動處理

appium有什么用?添加啟動參數:chromedriverExecutableDir,會自動找匹配的驅動版本,前提是文件夾下有這個匹配的驅動。

'chromedriverExecutableDir': join(dirname(__file__), 'driver')

添加json配置文件,指定版本映射,通過chromedriverChromeMappingFile 參數指定對應json文件,添加到啟動參數中

driver.json文件

{"2.42": "63.0.3239","2.41": "62.0.3202"
}
'chromedriverChromeMappingFile': join(dirname(__file__), 'driver', driver.json)

先通過chromedriverChromeMappingFile獲取對應版本的映射驅動,再在chromedriverExecutableDir目錄中找對應的驅動。


四、微信小程序測試

4.1、小程序的運行環境

在這里插入圖片描述

微信小程序運行在多種平臺上:iOS(iPhone/iPad) 微信客戶端、Android 微信客戶端、PC 微信客戶端、Mac 微信客戶端和用于調試的微信開發者工具。

appium原理和使用?各種平臺腳本執行環境以及用于渲染非原生組件的環境是各不相同的:

  • 在iOS上,小程序邏輯層的javascript代碼運行在JavaScriptCore中,視圖層是由WKWebView來渲染的,環境有iOS12、iOS13等。
  • 在Android上,小程序邏輯層的javascript代碼運行在V8中,視圖層是由自研XWeb引擎基于Mobile Chrome 內核來渲染的。
  • 在開發工具上,小程序邏輯層的javascript代碼是運行在NWJS中,視圖層是由Chrome WebView來渲染的。

4.2、平臺差異

盡管各運行環境是十分相似的,但是還是有些許區別:

  • JavaScript 語法和 API 支持不一致:語法上開發者可以通過開啟 ES6 轉 ES5 的功能來規避;此為,小程序基礎庫內置了必要的Polyfill,來彌補API的差異。
  • WXSS渲染表現不一致:盡管可以通過開啟樣式補償來規避大部分的問題,還是建議開發者需要在iOS和Android上分別檢查小程序的真實表現。

4.3、微信調試開關

微信每個版本都很"善變"

  • 可手工開啟調試開關
  • 默認關閉了調試開關而且無法開啟
  • 默認開啟調試開關

手工開啟辦法

  • 文件傳輸助手發送
  • debugtbs.qq.com
  • debugx5.qq.com
  • 打開微信小程序調試開關

4.4、微信小程序自動化測試

關鍵步驟

  • 設置chromedriver正確版本
  • 設置chrome option 傳遞給 chromedriver
  • 使用 adb proxy 解決 fix chromedriver的bug

為什么有些手機無法自動化微信小程序

  • 低版本的chromedriver在高版本的手機上有bug
  • chromedriver與微信定制的chrome內核實現上有問題

appium是啥?解決方案:fix it

  • chromedriver沒有使用adb命令,而是使用了adb協議
  • 參考adb proxy源代碼
mitmdump -p 5038 --rawtcp --mode reverse:http://localhost:5037/ -s adb_proxy.py 

微信小程序自動化測試輔助工具adb proxy

from mitmproxy.utils import strutils
from mitmproxy import ctx
from mitmproxy import tcpdef tcp_message(flow: tcp.TCPFlow):message = flow.messages[-1]old_content = message.content#message.content = old_content.replace(b"foo", b"bar")# 核定代碼,替換符合微信的webviewmessage.content = old_content.replace(b"@webview_devtools_remote_", b"@.*.*.*._devtools_remote_")ctx.log.info("[tcp_message{}] from {} to {}:\n{}".format(" (modified)" if message.content != old_content else "","client" if message.from_client else "server","server" if message.from_client else "client",strutils.bytes_to_escaped_str(message.content)))

五、Capability高級用法

更多詳細功能參考官網中文文檔

newCommandTimeout:用于客戶端在退出或者結束 session 之前,Appium 等待客戶端發送一條新命令所花費的時間(秒為單位),默認是60秒

udid:連接真機的唯一設備號,支持多設備運行。

autoGrantPermissions:讓Appium自動確定您的應用需要哪些權限,并在安裝時將其授予應用。默認設置為 false

appium自動化遍歷。測試策略相關

  • noReset:在當前 session 下不會重置應用的狀態。默認值為 false
  • fullReset:(iOS)刪除所有的模擬器文件夾。(Android) 要清除 app 里的數據,請將應用卸載才能達到重置應用的效果。在 Android, 在 session 完成之后也會將應用卸載掉。默認值為 false
  • dontStopAppOnReset:在使用 adb 啟動應用之前,不要終止被測應用的進程。如果被測應用是被其他鉤子(anchor)應用所創建的,設置該參數為 false 后,就允許鉤子(anchor)應用的進程在使用 adb 啟動被測應用期間仍然存在。換而言之,設置 dontStopAppOnReset 為 true 后,我們在 adb shell am start 的調用中不需要包含 -S標識(flag)。忽略該 capability 或 設置為 false 的話,就需要包含 -S 標識(flag)。默認值為 false

性能相關

  • skipServerInstallation:跳過 uiautomator2 server的安裝,非首次啟動使用
  • skipDeviceInitialization:跳過設備初始化
  • skipUnlock:
  • skipLogcatCapture:跳過日志的獲取
  • systemPort:
  • ignoreUnimportantViews:跳過不重要的組件獲取
  • -relaxed-security:啟動的時候設置

https://www.nshth.com/bcbj/338776.html
>

相关文章:

  • ui自動化測試工具
  • react native ui
  • appium和uiautomator的區別
  • 蘋果ui自動化是什么
  • appium中文官網
  • appium有什么用
  • appium原理和使用
  • appium是啥
  • pdf翻譯網站,1 Trillion Dollar Refund – How To Spoof PDF Signatures——欺騙PDF簽名
  • 如何創建一個抽象類,創建具體的產品,并繼承產品抽象類
  • 主從庫理論知識-主從同步如何實現?
  • Tomcat環境變量配置,Mybatis的配置文件參數詳解
  • I Am You,POJ 3130 How I Mathematician Wonder What You Are! 半平面交
  • 要學vue需要學什么基礎知識,第一章 Vue基礎入門
  • win7下安裝win10,win10下安裝Ubuntu18.10雙系統
  • vmplayer怎么使用烏邦圖,烏邦圖環境安裝
  • 計算機專業要不要考研——寫的很棒
  • redisson看門狗原理,記錄一次redis漏洞攻擊
  • 任意波形發生器,基于單片機信號波形發生器系統設計-畢設課設
  • 嵌入式驅動,嵌入式Linux驅動大全問世,十年磨一劍,視頻!服務!新老客戶都有大折扣!
  • socket連接器v2下載,Netty(一)基礎socketchannel,Buffer,selector黏包 半包解決 實戰
  • 大一c語言程序設計筆記,吉林大學2013級大一下學期程序設計作業:同學通訊錄系統
  • 暑期小學生計算機培訓班,青島小學生學習編程暑假
  • 熊貓毛小喵喵去哪里了,小西貝、何小喵看熊貓之觀察者設計模式
  • 如何用c語言比較兩個數的大小,如何用C語言求兩個數的較大值
  • 輾轉相除法求最小公倍數的方法,更相減損術--最大公約數
  • 輾轉相除法求最小公倍數的方法,如何求出兩個整數的最大公約數
  • 李新義的書畫藝術,中國現代書畫家——譚奇中、李義象、高俊鵬等
  • 海底撈張勇名言,致張勇先生一封信:海底撈的“七宗罪”!
  • WPF學習(12)動畫
  • ui自動化測試工具,移動端UI自動化之appium的使用(二)
  • 爬蟲網站,Search For Free —— 新聞爬蟲及爬取結果的查詢網站
  • tenda騰達無線設置,騰達F6路由器無線中繼功能設置
  • 斐波那契數列、小青蛙跳臺階
  • OJ每日一練——小青蛙上臺階
  • 小青蛙貝葉斯
  • 小青蛙走臺階問題
  • MySQL數據庫下載,NAVICAT FOR MYSQL存儲過程