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.mzph.cn/news/161576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络之物理层(数据通信有关)

一、概述 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…

爱创科技总裁谢朝晖荣获“推动医药健康产业高质量发展人物”

中国医药市场规模已经成为全球第二大医药市场,仅次于美国。近年来,随着中国经济的持续增长和人民生活水平的提高,医药市场需求不断扩大。政府对医疗卫生事业的投入也在不断加大,为医药行业的发展创造了良好的政策环境。为推动医药…

结构体与指针_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…

陪玩圈子系统APP小程序H5,详细介绍,源码交付,支持二开!

陪玩圈子系统&#xff0c;页面展示&#xff0c;源码交付&#xff0c;支持二开&#xff01; 陪玩后端下载地址&#xff1a;电竞开黑陪玩系统小程序&#xff0c;APP&#xff0c;H5: 本系统是集齐开黑&#xff0c;陪玩&#xff0c;陪聊于一体的专业APP&#xff0c;小程序&#xff…

Linux进程通信——共享内存

概念 共享内存&#xff08;Shared Memory&#xff09;&#xff0c;指两个或多个进程共享一个给定的存储区。 特点 共享内存是最快的一种 IPC&#xff0c;因为进程是直接对内存进行存取。 因为多个进程可以同时操作&#xff0c;所以需要进行同步。 信号量共享内存通常结合在一…

Open3D (C++) 计算两点云之间的最小距离

目录 一、 算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、 算法原理 Open3D中ComputePointCloudDistance函数提供了计算从源点云到目标点云的距离的方法,计算点云的距离。也…

【C语法学习】26 - strcmp()函数

文章目录 1 函数原型2 参数3 返回值4 比较机制5 示例5.1 示例1 1 函数原型 strcmp()&#xff1a;比较str1指向的字符串和str2指向的字符串&#xff0c;函数原型如下&#xff1a; int strcmp(const char *str1, const char *str2);2 参数 strcmp()函数有两个参数str1和str2&a…