IOS+Appium+Python自動化全實戰教程

由于公司的產品坐落于不同的平臺,如ios、mac、Android、windows、web。因此每次有新需求的時候,開發結束后,留給測試的時間也不多。此外,一些新的功能實現,偶爾會影響其他的模塊功能正常的使用。
網上的ios自動化方面的內容也是少之又少。由于本人對ios自動化初次接觸,花了兩天的時間到處找文章,才逐漸入了門。本文也是站在小白的角度,從0到1搭建ios自動化測試環境。

框架選型

查了很多資料,關于iOS自動化的框架有很多。但是支持Python的沒有幾個。

如:

UIAutomation 是蘋果提供的 UI 自動化測試框架,使用 JavaScript 編寫。
XCTest 是一個可以提供各個層次的測試的框架,比如單元測試,自動化測試,性能測試等。
KIF 使用未公開的 Apple API(私有 API),這對于測試目的而言是安全的,基于第三方 iOS UI 的單元測試框架,所以可以做項目的單元測試,也可以做 UI 集成測試。但缺點是運行較慢。且需要掌握Objective-C 語言。
Frank 是IOS 開發環境下一款實現自動測試的工具,Xcode 環境下開發完成后,通過 Frank 實現結構化的測試用例,其底層語言為 Ruby,作為一款開源的 iOS 測試工具,在國外已經有廣泛的應用。但是國內相關資料卻比較少。其最大的優點是允許我們用熟悉的自然語言實現實際的操作邏輯。

還有一些云測試平臺,因為都是收費的,這里也就不說了。
綜上所述,appium框架支持多種語言編寫自動化測試用例,且我之前使用過。因此我選擇了它。

appium驅動iOS測試原理

XCUITest是蘋果開發的一個做IOS自動化測試的框架,需要了解些Swift等iOS編程知識;WebDriverAgent是Facebook開發的一個iOS自動化測試工具,先來看下面的這張原理圖:

WDA在Client創建了一個Server,在手機端安裝了一個叫作WebDriverAgentRunner 的一個應用;這個應用會接收來自 Server 的指令,并連接底層的XCTest.framwork,讓 XCTest.framwork 調用蘋果API來操作手機進行自動化

而appium是把WebDriverAgentRunner 給集成進去了,因此實現了appium的跨平臺能力
通過上圖我們了解到 Appium 很粗暴的把整個 WebDriverAgent 直接集成到自己的項目里,然后通信機制就走 WebDriverAgent,Appium 其實就提供了一個 Client 端的作用。所以 iOS 9.3 系統之后自動化測試核心是 WebDriverAgent,Appium 就提供了一個 Client 端來寫腳本和發送指令。

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 操作手機進行自動化。

關于 WebDriverAgent

實現了一個 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。

環境搭建

硬件環境

一臺Mac、一部iphone(真機或虛擬機)、一條數據線

實際測試都是在真機上完成的,所以整篇文章都以真機為準。

自動化開發環境

開發環境:xcode, Command Line Tools, ,Pycharm, Python3, pip, setuptools

其他環境:homebrew, node, npm, carthage, appium, python-client, appium-doctor,

xcode,

電腦打開App Store搜索即可下載安裝,

Command Line Tools

為了配置appium環境,我們需要安裝Xcode Command Line Tools。


下載完成后,雙擊已下載的 .dmg 進行安裝,檢驗 Command Line Tools 是否安裝成功。

xcode-select --install # 查看是否安裝
xcode-select: error: command line tools are already installed, use "Software Update" to install updates(錯誤:命令行工具已經安裝,請使用“軟件更新”安裝更新)

Python,

官網下載一步下一步安裝即可,

pip & setuptools,

下載setuptools
https://pypi.python.org/pypi/setuptools
https://pypi.python.org/pypi/pip
打開cmd 進入setuptools解壓目錄,輸入:python setup.py install
進入pip解壓目錄,輸入:python setup.py install
安裝好后,打開終端,輸入pip,如提示不是內部命令,則將python安裝目錄下Scripts目錄添加到環境變量Path中。

Homebrew,

Homebrew是一個包管理軟件,它可以使我們更容易地安裝其他一些軟件終端輸入安裝:
/usr/bin/ruby -e "$(curl –fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
檢查homebrew是否安裝
brew -v //檢查homebrew是否安裝
brew list //查看已安裝列表
brew update //更新Homebrew

Node & NPM,

安裝
brew install node@14
查看node版本
node -v
配置國內源
npm config set registry https://registry.npm.taobao.org/

Carthage,

Carthage項目依賴管理, 類似于 java 的 maven; 主要是 WebDriverAgent 使用,WebDriverAgent 是用它做項目依賴的
終端輸入:
brew install carthage
更新carthage : brew upgrade carthage
重新安裝 : brew reinstall carthage
安裝完成后檢查一下是否安裝成功
carthage version

Appium,

安裝appium-server
https://github.com/appium/appium-desktop

Appium-Doctor,

檢查appium安裝是否成功的工具集指令
安裝 appium-doctor
npm install appium-doctor -g
檢查 iOS環境是否安裝成功
appium-doctor --ios

iOS 真機調試環境配置

webdriverAgent,

在github上下載最新webdriverAgent代碼
https://github.com/appium/WebDriverAgent
下載依賴(暫時可跳過,下面操作沒報錯,可忽略)
cd WebDriverAgent
mkdir -p Resources/WebDriverAgent.bundle
sh ./Scripts/build.sh

執行完成后,打開WebDriverAgent.xcodeproj文件。

配置開發者賬號,所有target建議都配置一遍。


連接并選擇自己的ios設備
窗口欄-Product-Destination-Device

選擇WebDriverAgentRunner,
窗口欄-Product-Test


如果有這個報錯,前往手機設置-通用-描述文件與設置管理,授信一下APP就OK了。


然后再次運行Test,就可以在Xcode控制臺看到下面的輸出信息:


瀏覽器打開,訪問上面的地址+/status,網頁返回以下內容,說明OK了。


有些iphone手機通過手機的IP和端口號還不能訪問,此時需要將手機的端口轉發到mac上,終端運行以下命令

iproxy 8100 8100
將手機的8100端口,映射到電腦的8100端口上。這樣我們就能通過訪問電腦的8100端口來訪問到手機了。

網上查到說“為了持續集成”,使用如下方法,在代碼中啟動wda,不需要在xcode啟動。

desiredCapabilities.setCapability("useNewWDA", true);
這種方法,我暫時沒有試過,特此記錄,有空再試。

appium-desktop (server)
打開下載的appium desktop

點擊 start server


因為新版本的 inspector 和 appium-desktop 分離了,我們需要去github下載inspector。
下載地址

安裝后,打開。在 Desired Capabilities 中輸入相關的參數后點擊Start Session


{
? "platformName": "ios",
? "appium:deviceName": "我的iPhone",
? "appium:platformVersion": "15.7.1",
? "appium:bundleId": "com.safety.authon",
? "appium:udid": "0a1386121527af8447cb5ac06de1d35cec8ea798"
}
以上信息,可通過xcode-菜單欄-Window-Devices and Simulator,獲取。

運行成功后,會彈出一個控制界面,在該界面中可以看到手機運行程序的布局元素。


自動化用例編寫


打開pycharm,新建一個項目。

安裝依賴,

pip install selenium
pip install Appium-Python-Client

編寫自動化測試用例代碼,

#! /usr/bin/env pyhton
# -*- coding:utf-8 -*-
# author:jeff.xie
# datetime:2023/11/22 16:23
# software:PyCharm# iphone app 啟動成功實戰測試用例from appium import webdriver
from time import sleepfrom appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.common.by import Bydriver = webdriver.Remote(command_executor = 'http://127.0.0.1:4723/wd/hub',
desired_capabilities = {
"platformName": "ios",
"appium:deviceName": "iPhone Jeff",
"appium:platformVersion": "16.5.1",
"appium:bundleId": "welab.bank.mobile.stage",
"appium:udid": "00008030-000A09C81A43802E"
})
sleep(10)ele = driver.find_element(AppiumBy.IOS_PREDICATE,"name == '用戶名稱'")
ele.send_keys("qatest101")
driver.find_element(By.ID,"")
sleep(2)# 參考 External Libraries.site-packages.appium.webdriver.common.appiumby
class AppiumBy(By):IOS_PREDICATE = '-ios predicate string'IOS_UIAUTOMATION = '-ios uiautomation'IOS_CLASS_CHAIN = '-ios class chain'ANDROID_UIAUTOMATOR = '-android uiautomator'ANDROID_VIEWTAG = '-android viewtag'ANDROID_DATA_MATCHER = '-android datamatcher'ANDROID_VIEW_MATCHER = '-android viewmatcher'# DeprecatedWINDOWS_UI_AUTOMATION = '-windows uiautomation'ACCESSIBILITY_ID = 'accessibility id'IMAGE = '-image'CUSTOM = '-custom'#參考seleniumclass By:"""Set of supported locator strategies."""ID = "id"XPATH = "xpath"LINK_TEXT = "link text"PARTIAL_LINK_TEXT = "partial link text"NAME = "name"TAG_NAME = "tag name"CLASS_NAME = "class name"CSS_SELECTOR = "css selector"

import unittest
import os
from appium import webdriver
from time ?import sleep


class ?appiumSimpleTezt (unittest.TestCase):

?? ?def ?setUp(self):
?? ??? ?app_path = '/Users/jx/appiumSimpleDemo/build/Release-iphoneos/appiumSimpleDemo.app'
?? ??? ?app = os.path.abspath(app_path)

?? ??? ?self.driver = webdriver.Remote(
?? ??? ??? ?command_executor = 'http://127.0.0.1:4723/wd/hub',
?? ??? ??? ?desired_capabilities = {
? "platformName": "ios",
? "appium:deviceName": "我的iPhone",
? "appium:platformVersion": "15.7.1",
? "appium:bundleId": "com.safety.authon",
? "appium:udid": "0a1386121527af8447cb5ac06de1d35cec8ea798"
}

?? ?def test_push_view(self):
?? ??? ?next_view_button = self.driver.find_element_by_accessibility_id("entry next view")
?? ??? ?next_view_button.click()

?? ??? ?sleep(2)

?? ??? ?back_view_button = self.driver.find_element_by_accessibility_id("Back")
?? ??? ?back_view_button.click()

?? ?def tearDown(self):
?? ??? ?sleep(1)
?? ??? ?# self.driver.quit()

if __name__ == '__main__':
?? ?suite = unittest.TestLoader().loadTestsFromTestCase(appiumSimpleTezt)
?? ?unittest.TextTestRunner(verbosity=2).run(suite)

以上就是ios自動化環境的過程,記錄下來。也方便自己回頭來看,也方便新人學習少走彎路。

以上內容參考了如下網站:
https://github.com/zhshijie/appiumSimpleDemo
http://appium.io/docs/en/about-appium/getting-started/
https://www.cnblogs.com/crstyl/p/14690895.html
https://github.com/appium/WebDriverAgent
?

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

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

相關文章

MyBatis-Plus的分頁插件和樂觀鎖插件

MyBatis-Plus: 探索分頁查詢和樂觀鎖插件 在現代的Web應用開發中,高效的數據處理是不可或缺的一部分。MyBatis-Plus,作為MyBatis的增強版,提供了多種插件來簡化和優化數據庫操作。在這篇博客中,我們將重點介紹兩個非常實用的插件…

09_面向對象高級_泛型

泛型 1. 認識泛型 定義類、接口、方法時,同時聲明了一個或多個類型變量(如:),稱為泛型類、泛型接口、泛型方法、它們統稱為泛型。 2. 泛型類 public class Test {public static void main(String[] args) {MyArray…

計算機網絡之物理層(數據通信有關)

一、概述 1.1物理層引入的目的 屏蔽掉傳輸介質的多樣性,導致數據傳輸方式的不同;物理層的引入使得高層看到的數據都是統一的0,1構成的比特流 1.2.物理層如何實現屏蔽 物理層靠定義的不同的通信協議(一般稱通信規程) 這些協議…

基于高質量訓練數據,GPT-4 Turbo更出色更強大

11月7日消息,OpenAI在首屆開發者大會上正式推出了GPT-4 Turbo。 與GPT-4相比,GPT-4 Turbo主要有6方面的提升: 1、擴展下文對話長度:GPT4最大只能支持8k的上下文長度(約等于6000個單詞),而GPT-4…

智能小車速通版——手把手教程

考慮到大部分學校,會發放簡易小車來作為智能車初期培訓和篩選的工具, 于是,我寫一個簡單的教程,能夠實現簡單小車的電磁循跡。 通過這個教程,能夠通過簡化的步驟搭建尋跡小車,進而了解整個智能車是如何實…

Redis-Redis持久化,主從哨兵架構詳解

Redis持久化 RDB快照(snapshot) 在默認情況下, Redis 將內存數據庫快照保存在名字為 dump.rdb 的二進制文件中。 你可以對 Redis 進行設置, 讓它在“ N 秒內數據集至少有 M 個改動”這一條件被滿足時, 自動保存一次數…

【操作系統】I/O軟件層次結構

文章目錄 1. 前言2. I/O軟件層次結構2.1 用戶層軟件2.2 設備獨立性軟件2.3 設備驅動程序2.4 中斷處理程序 1. 前言 偶然看到“程序員的護城河是什么”這個話題,作為一個工作兩年多的程序員吧,經常看到網上關于各種35歲危機、裁員甚至猝死之云云。最近也…

modbus協議及modbus TCP協議

一、Modbus協議 1.起源 Modbus由Modicon公司于1979年開發,是一種工業現場總線協議標準。 Modbus通信協議具有多個變種,其中有支持串口,以太網多個版本,其中最著名的是Modbus RTU(通信效率最高,基于串口&am…

springboot前后端分離項目配置https接口(ssl證書)

文章目錄 說明vue.js前端部署vue.js項目axios請求配置本地創建日志文件創建Dockerfile文件配置ssl證書nginx.confvue項目打包上傳創建容器部署 后端springboot項目部署配置ssl證書打包部署 補充:jsk證書和pfx證書補充:兩種證書的轉化JKS轉PFXPFX 轉 JKS …

Elasticsearch:將最大內積引入 Lucene

作者:Benjamin Trent 目前,Lucene 限制 dot_product (點積) 只能在標準化向量上使用。 歸一化迫使所有向量幅度等于一。 雖然在許多情況下這是可以接受的,但它可能會導致某些數據集的相關性問題。 一個典型的例子是 Cohere 構建的嵌入&#x…

使用 Lhotse 高效管理音頻數據集

Lhotse 是一個旨在使語音和音頻數據準備更具靈活性和可訪問性的 Python 庫,它與 k2 一起,構成了下一代 Kaldi 語音處理庫的一部分。 主要目標: 1. 以 Python 為中心的設計吸引更廣泛的社區參與語音處理任務。 2. 為有經驗的 Kaldi 用戶提供…

SpringBoot——啟動類的原理

優質博文:IT-BLOG-CN SpringBoot啟動類上使用SpringBootApplication注解,該注解是一個組合注解,包含多個其它注解。和類定義SpringApplication.run要揭開SpringBoot的神秘面紗,我們要從這兩位開始就可以了。 SpringBootApplicati…

Spring實例化對象

默認proxyBeanMethods true,這種方法是用的代理模式創建對象,每次創建都是同一個對象,如果改為false每次都是不同的對象 FactoryBean的使用 定義的類A,造出來一個類B,可以在創造bean之前做一些自己的個性化操作

MFS分布式文件系統

目錄 集群部署 Master Servers ?Chunkservers ?編輯Clients Storage Classes LABEL mfs高可用 pacemaker高可用 ?編輯ISCSI 添加集群資源 主機 ip 角色 server1 192.168.81.11 Master Servers server2 192.168.81.12 Chunkservers server3 192.168.81.13 Chunkserver…

【產品安全平臺】上海道寧與Cybellum將整個產品安全工作流程整合到一個專用平臺中,保持構建的互聯產品的網絡安全和網絡合規性

Cybellum將 整個產品安全工作流程 整合到一個專用平臺中 使設備制造商能夠 保持他們構建的互聯產品的 網絡安全和網絡合規性 產品安全性對 每個人來說都不一樣 每個行業的系統、工作流程和 法規都存在根本差異 因此,Cybellum量身定制了 Cybellum的平臺和技…

為何內存不夠用?微服務改造啟動多個Spring Boot的陷阱與解決方案

在生產環境中我們會遇到一些問題,此文主要記錄并復盤一下當時項目中的實際問題及解決過程。 背景簡述 最初系統上線后都比較正常風平浪靜的。在系統運行了一段時間后,業務量上升后,生產上發現java應用內存占用過高,服務器總共64…

打印出一個底部有n個*的漏斗c語言

題目描述 打印出一個底部有n個*的漏斗 輸入 第一行輸入一個T;表示有T組測試數據 下面每一行都有一個n表示漏斗底部*的個數 n保證是奇數 輸出 輸出打印結果 兩個測試答案之間要用換行分割 /*printf("這是第%d行 我要打印%d個* \n",Num,i); */ *********** *…

愛創科技總裁謝朝暉榮獲“推動醫藥健康產業高質量發展人物”

中國醫藥市場規模已經成為全球第二大醫藥市場,僅次于美國。近年來,隨著中國經濟的持續增長和人民生活水平的提高,醫藥市場需求不斷擴大。政府對醫療衛生事業的投入也在不斷加大,為醫藥行業的發展創造了良好的政策環境。為推動醫藥…

SparkSession介紹

一、 介紹 SparkSession是Spark 2.0中引入的新概念,它是Spark SQL、DataFrame和Dataset API的入口點,是Spark編程的統一API,也可看作是讀取數據的統一入口;它將以前的SparkContext、SQLContext和HiveContext組合在一起&#xff0…

結構體與指針_sizeof_static_extern_函數指針數組_函數指針_回調函數

一、結構體與指針 #include <stdint.h> #include <stdlib.h> #include <stdio.h> #define up_to_down(uuu) (downdemo_t *)(uuu->beg) #define __plc__ typedef struct updemo_s{uint8_t *head;uint8_t *beg;uint8_t *end; }updemo_t; typedef struct do…