日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Appium iOS 自动化测试总结

發布時間:2023/12/31 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Appium iOS 自动化测试总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、iOS Appium 原理

1.1 iOS 9.3 系統之前自動化測試

1.1.1 Native 自動化

這是iOS 9.3 系統之前自動化測試的架構模式。通過Android Appium 原理的學習 ,我們很容易理解 iOS Appium 原理:

  • Appium Client 端執行代碼發送到 Appium Server端(Server 集成了蘋果官方的 Instruments);

  • Server 端將一行行代碼翻譯成一條條指令,同時在手機上注入 bootstrap.jar ;

  • Server 與該 jar 包通信將指令傳給 bootstrap.jar,jar 包調用手機里的自動化測試框架(UIAutomation),UIAutomation框架執行指令。

1.1.2 Hybrid(WebView)自動化

通過 Android Appium 原理的學習,Android 4.4 系統之后,Appium 支持使用 ChromeDriver 進行對 Hybrid 頁面的自動化測試。那么 iOS 上是怎么做的呢?
iOS 上早期蘋果官方就一直提供 iOS webkit debug proxy(這是蘋果官方自己開發的私有的通信協議),Appium 集成了該框架,通過它傳遞指令。

1.2 iOS 9.3 系統之后自動化測試

Appium 在 iOS 下工具的變革

  • iOS 9 之前一直以 instruments 下的 UIAutomation為驅動底層技術(弊端由于 instruments 的限制,單臺 mac 只能對應單臺設備);
  • iOS 9.3 時代推出 XCUITest 工具,用以替代 UIAutomation;
  • iOS 10 時代蘋果直接廢棄了 UIAutomation、Facebook 推出 WebDriverAgent(實現的 server 能夠支持單臺 mac 對應多個設備);
  • Appium 在iOS 9.3 后全面采用 WebDriverAgent 的方案。

1.2.1 關于 WebDriverAgent

  • FaceBook 出品;
  • 實現了一個 server,通過 server 可以遠程控制 iOS 設備:啟動應用、關閉應用、點擊、滾動等操作;
  • 通過連接 XCTest.framework 調用蘋果的 API 執行動作;
  • 支持多個設備同時進行自動化;
  • Appium、Macaca 已經集成。

但是 WebDriverAgent 僅僅只提供了一個 server(和 inspect 進行元素定位),并沒有像 Appium 一樣提供 java 或 python 的 Client 端去寫腳本,腳本執行的時候發送指令給 server,然后去運行。WebDriverAgent 要求你自己去實現 Client 端,即拿 Java/ Python 的 WebDriver 庫進行封裝,然后發送指令。 所以 WebDriverAgent 其實就類似于 Appium server,就只是一個 server。

1.2.2 關于 iOS 9.3 之后的 Appium 自動化架構模式

Appium 很粗暴的把整個 WebDriverAgent 直接集成到自己的項目里,然后通信機制就走 WebDriverAgent,Appium 其實就提供了一個 Client 端的作用。
所以 iOS 9.3 系統之后自動化測試核心是 WebDriverAgent,Appium 就提供了一個 Client 端來寫腳本和發送指令。

通過前面的學習,我們知道 Appium 自動化架構模式可以用一個抽象的架構表示,就是下面這樣的:

iOS 9.3以及之后的 Appium 自動化架構模式如下圖所示:

從圖中可以看出:

  • Client 端是 Appium 之前本身提供的;

  • Server 端是:WebDriverAgent 和 Instruments;( Appium 直接把 WebDriverAgent 整個集成進來,Instruments 是為了支持 iOS 9.3 之前的系統)

  • 最右邊是一個手機

  • 之前 Server 是和 bootstrap.jar 通信,這里 WebDriverAgent 提供了 WebDriverAgentRunner (類似 bootstrap.jar 的功能),WebDriverAgent與之通信;
  • WebDriverAgentRunner 是一個應用,Client 和 server 運行了之后,WebDriverAgentRunner 會被裝到手機上,這個應用會接收來自 Server 的指令,并連接底層的 XCTest.framwork,并告訴 XCTest.framwork 操作手機進行自動化。

1.2.3 必裝的軟件

Xcode、command line tool、libimobiledevice、ios-deploy、carthage、WebDriverAgent、Appium。

  • libimobiledevice / ideviceinstaller 庫,相當于 android 的 adb,是 Appium
    底層用到的工具之一,用于獲取 iOS 設備信息。
  • 其常用命令如下:

    • 查看當前所連接的設備

      idevice_id -l # 顯示當前所連接設備的 udid instruments -s devices # 列出所有設備,包括真機、模擬器、mac
    • 安裝應用

      ideviceinstaller -u [udid] -i [xxx.ipa] # xxx.ipa 為應用在本地的路徑
    • 卸載應用

      ideviceinstaller -u [udid] -U [bundleId]
    • 查看設備已安裝的應用

      ideviceinstaller -u [udid] -l # 查看設備安裝的第三方應用 ideviceinstaller -u [udid] -l -o list_user # 同上,查看設備安裝的第三方應用 ideviceinstaller -u [udid] -l -o list_system # 查看設備安裝的系統應用 ideviceinstaller -u [udid] -l -o list_all # 查看設備安裝的所有應用
    • 獲取設備信息

    ideviceinfo -u [udid] # 獲取設備信息ideviceinfo -u [udid] -k DeviceName # 獲取設備名稱 同命令 idevicenameidevicename # 同上ideviceinfo -u [udid] -k ProductVersion # 獲取設備版本 10.3.3ideviceinfo -u [udid] -k ProductType # 獲取設備類型 iPhone 8,1ideviceinfo -u [udid] -k ProductName # 獲取設備系統名稱
    • 其他系統文件信息
    ideviceinfo # 獲取設備所有信息idevicesyslog # 獲取設備日志idevicecrashreport -e test # 獲取設備 crashlog,test 是文件夾需新建idevicediagnostics # 管理設備狀態 - 重啟、關機、睡眠等
  • ios-deploy 常用命令
  • ios-deploy -c # 查看當前鏈接的設備ios-deploy --[xxx.app] # 安裝APPios-deploy --id [udid] --uninstall_only --bundle_id [bundleId] # 卸載應用ios-deploy --id [udid] --list_bundle_id # 查看所有應用ios-deploy --id [udid] --exists --bundle_id # 查看應用是否安裝
  • carthage,項目依賴管理,主要是 WebDriverAgent 使用,WebDriverAgent 是用它做項目依賴的;
  • 公司 iOS 項目也使用 carthage,類似于 java 的 maven;
  • ios-deploy、ideviceinstaller 類似 android 的 adb;

  • authroize-ios,iOS 授權工具,主要用于模擬器中一些權限的授權;

  • npm install -g authroze-ios sudo authroze-ios

    1.2.4 安裝 WebDriverAgent

  • 從 FB 的 GitHub 上下載WebDriverAgent

    GitHub 上下載WebDriverAgent

  • 初始化項目

    在 WebDriverAgent 目錄下執行:./Scripts/bootstrap.sh

  • 編譯 WebDriverAgent

    a. open WebDriverAgent.xcodeproj(會使用默認打開工具Xcode打開項目)。b. 修改 WebDriverAgent.lib 以及 WebDriverAgentRunner 這兩個 target 下的 General 和 Build Settings列表(前者是在 mac 上運行的,后者是在手機上運行的)。c. General 列表需要修改:簽名 Signing 和 BundleId: 簽名 Signing:可以用個人免費開發者證書,用任意 AppleId 可申請;BundleId:之前 BundleId 是綁定了 FB team 的證書的,不能使用,所以要改一個新的。 Build Settings列表需要修改 BundleId 和 上一步一樣。d. WebDriverAgentRunner 是在手機上運行的,要想在手機上安裝,需要和上一步一樣修改 General 和 Build Settings 列表。e. 手機上設置 - 通用 - 描述文件 里信任一下該證書。f. Xcode - Product - Test,會安裝 WebDriverAgentRunner 并啟動 WebDriverAgent 這個 server。
  • 替換 Appium 下的 WebDriverAgent:刪除原 WebDriverAgent 文件夾,把編譯好的 WebDriverAgent 放進去即可

    a . 如果用 npm 安裝的目錄在:cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/;b. 如果用 desktop 安裝的目錄在:/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/)
  • 1.2.5 開始跑腳本 Sample-Code

    1.2.5.1 準備 APP

    這里我們需要將TestApp重新編譯才能使用。

  • 進入 APP 其 xxx.xcodeproj 對應的目錄,open WebDriverAgent.xcodeproj 打開項目;

  • 修改該項目里 target 的 General 和 Build Settings列表(和上面一樣);

  • 通過 Xcode 編譯運行。

    或者通過 xcodebuild 命令通過命令行編譯運行 xcodebuild -project TestApp.xcodeproj -target TestApp -sdk iphoneos10.3 -configurationdevelopment
  • 1.2.5.2 準備腳本

    • iOS 項目的 Desired_caps

      Desired_caps:{’platformName’:’iOS’,‘platformVersion’:’10.3.3’,‘devideName’:’iPhone 7 Plus’,‘udid’:’’, #如果是真機的話必須提供‘app’:’~/appPath/app.app’, #app路徑,如果只填bundleId,那就是通過id啟動已有的App}
    • iOS 的元素定位

      Appium Desktop - Inspect (推薦)WebDriverAgent - Inspector

    這里說說 Appium Desktop - Inspect 是怎么使用的。
    -打開并啟動 Appium Desktop,點擊軟件右上角第一個按鈕 “ start inspector session”;
    -會出現彈窗,彈窗里配置好 Desired_caps。

    • 定位方式推薦:AccessbilityId

    其他Desired_caps配置參見官方文檔:https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md

    注意
    webdriver.py 里只延展定義了針對移動端的 API,is_displayed()、.is_enabled()() 等這些 API 可以去看 WebDriver 即 Slenium 2 本身的。

    WebDriver 本身的 API 詳見

    原文鏈接:https://testerhome.com/topics/10068

    1.3 IOS元素定位方法簡單介紹

    由于使用id、className、AccessibilityId定位方式較為簡單,多數情況下,在同一個頁面,都不是唯一存在的,不能識別一個元素。而 xpath定位方式在 xcui 底層原生不支持,由 appium 額外支持的,定位速度很慢,而且有時候定位不到元素的情況存在。綜上所述,在 iOS 的 UI 自動化中,使用原生支持的iOSNsPredicateString定位方式是最好,支持也是最好的。

    1.3.1 定位方式

    iOS 版本全支持,底層測試框架無論是XCUITest 或 UIAutomation,可支持元素的單個屬性和多個屬性定位,推薦使用。一個元素有這些屬性:type、value、name、label、enabled、visible,有些元素的屬性只有以上的部分屬性,如下圖所示,可根據這些屬性進行元素定位

    1.3.2 元素屬性的介紹

    type:元素類型,與className作用一致,如:XCUIElementTypeStaticText
    value: 一般不用
    name:元素的文本內容,可用作 AccessibilityId定位方式,如:測試420班級群
    label:絕大多數情況下,與 name 作用一致
    enabled:元素是否可點擊,一般值為true或者false
    visible:元素是否可見,一般值為true或者false

    1.3.3 元素定位方式

    元素的定位方式都是一個屬性+運算符+值形式存在

    1、比較運算符:>,<,==,>=,<=,!=
    可用于數值和字符串的比較,
    如:name>100 或name == ‘測試’

    2、范圍運算符:IN,BETWEEN
    可用于數值和字符串的范圍核對
    如:name BETWEEN {3,10},name IN {‘Alan’,‘May’}

    3、字符串相關:CONTAINS、BEGINSWITH、ENDSWITH
    包含某個字符串,如:label CONTAINS ‘測試’
    以某個字符串開頭,如:label BEGINSWITH ‘420’
    以某個字符串結束,如:label ENDSWITH ‘班級群’
    PS:在三個關鍵字后加上[c]不區分大小寫,可用于字母的校驗;[d]不區分發音符號,即沒有重音符號($、#、%等);[cd]即不區分大小寫,也不區分發音符號,如:name CONTAINS[c] ABcd和name CONTAINS abcd、name CONTAINS ABCD是等同的,注意后面兩個沒帶[c]的不相等

    4、通配符:LIKE
    通配符也接受[cd],?代表一個字符,*代表多個字符
    如:一個元素的label屬性為

    label LIKE ‘420測試班級群’

    label LIKE ‘420測?班級群’

    label LIKE ‘420??班級群’

    label LIKE ‘42?測試班?群’

    label LIKE ‘*試班級群’

    label LIKE ‘420測試班*’

    label LIKE ‘42*級群’

    label LIKE ‘4試群’

    以上這么多種文本都可以被識別為同一個元素。

    5、正則表達式:MATCHES
    如:以4開頭,以群結束,

    label MATCHES ‘^4.+群$’

    1.3.4 以一種屬性定位元素

    可以用元素的屬性:type、value、name、label、enabled、visible,進行定位:

    type == XCUIElementTypeStaticText,

    label CONTAINS ‘測試’

    label LIKE ‘*試班級群’

    enabled == true

    visible == false

    1.3.5 以兩種或兩種以上屬性定位元素

    就是以上單個屬性定位用符號AND連接起來即可。如:

    type == XCUIElementTypeStaticText AND labelCONTAINS '測試

    type == XCUIElementTypeStaticText AND labelCONTAINS ‘測試’ AND enabled == true

    1.3.6 父子關系、兄弟關系定位

    #父子關系定位 self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.xueqiu.android:id/title_container").childSelector(text("股票"))')#兄弟關系定位 self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.xueqiu.android:id/title_container").fromParent(text("股票"))')

    1.3.7 滾動查找

    #滾動查找 self.driver.find_element_by_android_uiautomator('new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().text("查找的元素文本").instance(0));')

    1.3.8 使用方法

    // 等于

    MobileElement photo = driver.findElementByIosNsPredicate("name= ‘head new‘");

    // 模糊匹配

    MobileElement photo =driver.findElementByIosNsPredicate("name LIKE ‘*new‘");

    // 正則表達式匹配

    MobileElement photo = driver.findElementByIosNsPredicate("nameMATCHES ‘^$‘");

    // 包含

    List<IOSElement> items1 = driver.findElementsByIosNsPredicate("nameCONTAINS ‘我的‘");

    // 以"我的"開始

    List<IOSElement> items2 = driver.findElementsByIosNsPredicate("nameBEGINSWITH ‘我的‘");

    // 以"我的"開始并且以"消息"結尾

    List<IOSElement> items3 = driver.findElementsByIosNsPredicate("nameBEGINSWITH ‘我的‘ && name ENDSWITH ‘消息‘");

    其中屬性名參照inspector的屬性字段,關鍵字LIKE,MATCHES,CONTAINS,BEGINSWITH,ENDSWITH必須是大寫,匹配的字符需要用單引號

    小坑建議:

  • 選擇定位方式的判斷:
      如果顯示在界面的文本唯一或是第一個出現:使用accessibility
      如果class唯一或是第一個出現:className
      ID或class不方便定位,控件屬性有明確的匹配規則:accessibility
      如果有工具可以直接給出準確的xpath:xpath
      實在不行就用坐標吧
  • 如果控件的屬性visible是false的話,請使用控件坐標并獲取中心點用tap點擊,直接點擊控件會失敗
  • 二、Appium 搭建 IOS

    可以參考:
    wangmcn84作者的模擬器
    真機自動化環境搭建
    真機自動化環境搭建-實際操作
    http://10.0.223.58:8100/status
    如果是想查看UI的圖層,則可訪問http://localhost:8100/inspector,方便書寫測試用 已廢棄

    三、定位方法性能對比

    查找元素的順序,從快到慢:

    ios_predicate >> accessibility_id >> class_name >>xpath

    (論壇比較多的說法是class_name>>accessibility_id,在這里我們姑且認為它們的速度是一樣的。)

  • ios_predicate:OS 的 UI 自動化中,使用原生支持的Predicate定位方式是最好,可支持元素的單個屬性和多個屬性定位,強烈推薦使用
    driver.find_element_by_ios_predicate(“value == ‘ClearEmail’”)
    driver.find_element_by_ios_predicate(“type == ‘’ AND value == ‘’)
    https://www.jianshu.com/p/a6c2d72fe704
  • accessibility_id
    替代以前的name定位方式,在 iOS 上,主要使用元素的label或name(兩個屬性的值都一樣)屬性進行定位,如該屬性為空,也是不能使用該屬性。
    driver.find_element_by_accessibility_id(‘ClearEmail’)
  • class_name
    使用元素的type屬性定位,特別注意該屬性的唯一性!class_name唯一的情況并不多,一般情況下用不上。
    driver.find_element_by_class_name(‘XCUIElementTypeButton’)
  • xpath
    由于 iOS 10開始使用的 XCUITest 框架原生不支持,定位速度很慢,所以官方現在不推薦大家使用,也有其他替代的定位方式可使用。
    1)使用絕對路徑定位:
    driver.find_element_by_xpath(’/XCUIElementTypeApplication/XCUIElementTypeButton’)
    2)使用相對路徑定位
    driver.find_element_by_xpath(’//XCUIElementTypeButton’)
    3)通過元素的索引定位
    driver.find_element_by_xpath(’//XCUIElementTypeButton[index]’)
    4)通過元素的屬性定位
    一種屬性:
    driver.find_element_by_xpath(”//className[@value=‘ClearEmail’]“)
    兩種屬性:
    driver.find_element_by_xpath(”//className[@value=‘ClearEmail’][@ visible =true]“)
    部分屬性(最強大):driver.find_element_by_xpath(”//className[contains(@value,‘ClearEmail’)]")
    5)iOSNsPredicateString
    僅支持 iOS 10或以上,可支持元素的單個屬性和多個屬性定位,推薦使用。
    一種屬性:MobileBy.iOSNsPredicateString(“type == ‘XCUIElementTypeButton’”)
    兩種屬性:MobileBy.iOSNsPredicateString(“type == ‘XCUIElementTypeButton’ AND label == ‘更多信息’”)
  • 四、經典問題

  • appium測試-操作Android非原生View(自定義)控件(如部分日期和地點選擇下拉控件),基于JavaCV的圖像匹配方法

  • Appium使用swipe定位滾動列表和滾動屏幕元素

  • iOS 測試 ios+appium 自動化 click 無效
    問題現象
    app 頁面上可以看到元素,并且通過 find_element_by_xpath 方法也可以定位到,但操作 click 后,頁面并未如預期進行跳轉,點擊實際上沒有生效

    問題原因
    通過 self.driver.page_source 獲取頁面 xml,發現元素屬性 visible=‘false’,導致 click 不生效

    解決方法
    用 TouchAction 方法,通過坐標進行點擊,python 實現如下

    def touch_on_ele(self, ele):x_pos = ele.location['x'] + ele.size['width'] / 2y_pos = ele.location['y'] + ele.size['height'] / 2TouchAction(self.driver).tap(x=x_pos, y=y_pos).perform()

    思路:如果控件的屬性visible是false的話,請使用控件坐標并獲取中心點用tap點擊,直接點擊控件會失敗

    需要引入 TouchAction 庫

    from appium.webdriver.common.touch_action import TouchAction
  • 元素錯位 卸載騰訊tbs

  • IOS原生定位不支持純數字匹配

  • 五、補充

    目前,Appium 支持的定位方式,如下所示:

    cssSelector # Selenium 最強大的定位方法,比 xpath 速度快,但比 xpath 難上手 linkText # 鏈接元素的全部顯示文字 partialLinkText # 鏈接元素的部分顯示文字 name # 元素的 name 屬性,目前官方在移動端去掉這個定位方式,使用 AccessibilityId 替代 tagName # 元素的標簽名 className # 元素的 class 屬性 id # 元素的 id 屬性 xpath # 比 css 定位方式稍弱一些的定位方法,但勝在容易上手,比較好使用,缺點就是速度慢一些。 AccessibilityId # Appium 中用于替代 name 定位方式 AndroidUIAutomator # Android 測試,最強大速度最快的定位方式 iOSNsPredicateString # iOS 謂詞的定位方式,僅支持 XCTest 框架,需大于 iOS 9.3或以上 IosUIAutomation # iOS 謂詞的定位方式,僅支持 UIAutomation 框架,需大于 iOS 9.3或以下 iOSClassChain # 國外大神 Mykola Mokhnach 開發類似 xpath 的定位方式,僅支持 XCTest 框架,,不如 xpath 和 iOSNsPredicateString 好 windowsAutomation # windows 應用自動化的定位方式

    詳細可以參考:https://zhuanlan.zhihu.com/p/28625273

    總結

    以上是生活随笔為你收集整理的Appium iOS 自动化测试总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。