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 sleep

from appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.common.by import By

driver = 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'
    # Deprecated
    WINDOWS_UI_AUTOMATION = '-windows uiautomation'
    ACCESSIBILITY_ID = 'accessibility id'
    IMAGE = '-image'
    CUSTOM = '-custom'


#参考selenium

class 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

相关推荐
Garcia Shan1 小时前
【Dash】使用 Bootstrap Componnet 创建图表
开发语言·python·bootstrap·数据可视化·dash
limengshi1383921 小时前
使用Python+moviepy调整音频音量的两种方式
python·音视频
檀越剑指大厂1 小时前
【Python系列】使用 `isinstance()` 替代 `type()` 函数
开发语言·python
测试1枚2 小时前
软件测试经理工作日常随记【7】-接口+UI自动化(多端集成测试)
python·ui·自动化·集成测试·pytest·测试覆盖率
水木流年追梦2 小时前
【大模型从入门到精通9】openAI API 提升机器推理:高级策略3
人工智能·python·深度学习·分类·数据挖掘
s_m_c2 小时前
ImageBind-LLM: Multi-modality Instruction Tuning
python
简佐义的博客4 小时前
生信分析的过去(R语言)、现在(Python)和未来(云平台)
开发语言·python·r语言
代码不行的搬运工4 小时前
PYTHON专题-(8)我错了该怎么整?
开发语言·python
大江东去浪淘尽千古风流人物4 小时前
【ML】transform 之 decoder 及其实现细节
pytorch·python·transformer·batch·deep learning
CPU NULL5 小时前
python列表
开发语言·python