概述

1、本人进入IT行业第一份工作是测试自动化方向的,所以针对这一段工作,对自动化测试工具Appium的学习、使用作出整理和总结。

2、对于appium工具的基础使用,注意以下几个关键字:
(1)appium只是针对android、ios等的自动化工具进行了集成;还有就是appium这个集成工具是使用nodejs开发的。
(2)Appium clients list。
(3)Appium Server Parameters。
(4)Capabilities Doc。
(4)appium/appium-idb。
(5)对于更深入的原理学习可以在github网站上查找,例如:
Conceptual Introduction。

针对python3语言对appium工具基础使用的笔记

如果系统上成功安装了Appium工具,则按如下方式使用Appium Python Client:
(1)从PyPi安装’Appium-Python-Client’模块:

pip install Appium-Python-Client

(2)可以开始编写脚本使用Appium-Python-Client:

(a)Android environment(真机):

from appium import webdriverdesired_caps = {}
desired_caps['platformName'] = 'Android'
# desired_caps['platformVersion'] = '8.1'
# desired_caps['automationName'] = 'uiautomator2'
desired_caps['deviceName'] = 'Android'
# desired_caps['app'] = PATH('../../../apps/selendroid-test-app.apk')
desired_caps['appActivity'] = '...' # 可以使用adb工具获取
desired_caps['appPackage'] = '...'  # 可以使用adb工具获取
desired_caps['udid'] = '...'       # 可以使用 $ adb devices 获取
desired_caps['ignoreUnimportantViews'] = 'true'
# ...
# 如果需要其他的参数可以查看`Capabilities Doc`,并添加
# ...
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# ...

(b)iOS environment(真机):

from appium import webdriverdesired_caps = {}
desired_caps['platformName'] = 'iOS'
# desired_caps['platformVersion'] = '11.4'
desired_caps['automationName'] = 'XCUITest'
desired_caps['deviceName'] = 'iPhone'
# desired_caps['app'] = PATH('../../apps/UICatalog.app.zip')
desired_caps['udid'] = '...'     # 可以使用 $ idevice_id -l 获取
desired_caps['bundleId'] = '...' # 可以使用 $ ideviceinstaller -l 获取
# ...
# 如果需要其他的参数可以查看`Capabilities Doc`,并添加
# ...
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# ...

针对IOS自动化的相关笔记

1、在Mac OS系统下完成安装Appium。

2、针对WDA(WebDriverAgent)的使用笔记:

以下python3代码在Mac OS 10.13.6、Xcode10.0、Appium1.8.0、IOS12.0.1、Python 3.6.3工具环境下,并在第一步中成功安装Appium的条件下,测试成功。
代码的目的是为了实现IOS移动设备的切网功能,下面代码实现了核心代码,没有实现切网的全部代码。

(1)前面提到了Appium工具是一个集成工具,针对IOS的自动化实现,是使用了WDA工具;

(2)使用WDA可以实现对手机的直接控制,具体介绍和简单使用如下:

a. 先使用xcodebuild命令启动WDA软件;

project = "/Applications/Appium.app/Contents/Resources/app/node_modules\/appium/node_modules/appium-xcuitest-driver\/WebDriverAgent/WebDriverAgent.xcodeproj"scheme = 'WebDriverAgentRunner'commond =  "xcodebuild -project %s -scheme %s -destination 'id=%s' test" % (project, scheme, udid)

b. 再使用iproxy命令,使得Mac电脑指定端口与IOS设备上WDA软件的端口进行映射;

commond = "iproxy %s 8100 %s" % (mac_port, udid)

c. 在a、b步骤中的命令工具都成功启动后,即可使用HTTP请求的方式访问Mac本地(即localhost)的指定的不同端口(即mac_port)来控制对应的IOS设备。
例如,使用GET方式,访问“http://localhost:<mac_port>/status”,可以获取SessionID。示例代码如下:

def get_session(mac_port):"""访问Mac上的指定端口,获取指定手机与Mac的SessionId"""rs = http_get2('http://localhost:%s/status' % mac_port)if not rs.startswith('error'):rs_json = json.loads(rs, encoding='utf-8')session_id = rs_json['sessionId']return session_id

上面的三个步骤简单阐述了直接使用WDA控制IOS移动设备的方法。更多信息可参考Github网站相关资源

完整测试代码如下:

#!/usr/bin/env python3import threading
import subprocess
import json
import urllib.request
import time
from xml.dom import minidom
from http import clientdef ex_cmd3(cmd):"""子进程工具:xcodebuild & iproxy命令的子进程没有进行时间控制,而是采用任务完成后直接杀进程。该处可以自行优化。"""p = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)p.wait()def http_get2(url):"""发送GET请求"""try:gt = urllib.request.urlopen(url,timeout=60)except Exception as ex:res = 'error:%s' % exelse:if gt.getcode() == 200:resp = gt.read()resp_str = resp.decode('utf8')res = resp_strelse:res = 'error:%d' % gt.getcode()gt.close()return resdef req_post(req_data, session_id, action, mac_port):"""发送POST请求,进行操作ios界面内容。"""req_data_json = json.dumps(req_data)url = 'http://localhost:%s/session/' % (mac_port) + session_id + actionheader = {"Content-type": "application/json"}conn = client.HTTPConnection("localhost", int(mac_port))conn.request('POST', url, req_data_json, header)res = conn.getresponse()res = res.read()conn.close()return resdef start_up_wda(mac_port,udid):""" 启动WebDriverAgent工具,并获取指定IOS移动设备的session id。 """def startup_wda(mac_port, udid):"""启动xcodebuild & iproxy:WDA为IOS软件包,使用xcodebuild命令启动;使用iproxy命令使Mac与iPhone建立端口映射。"""project = "/Applications/Appium.app/Contents/Resources/app/node_modules\
/appium/node_modules/appium-xcuitest-driver\
/WebDriverAgent/WebDriverAgent.xcodeproj"# print(project)scheme = 'WebDriverAgentRunner'commond =  "xcodebuild -project %s -scheme %s -destination 'id=%s' test" % (project, scheme, udid)threading.Thread(target=ex_cmd3, args=(commond,)).start() # xcodebuild命令的更多信息,使用 $ xcodebuild --help来查询print("xcodebuild命令行已启动!")time.sleep(30)commond = "iproxy %s 8100 %s" % (mac_port, udid)  # 每个IOS上WDA软件的服务端口为8100                                             # 而Mac由于连接多个手机,Mac上的端口可以自行设定。threading.Thread(target=ex_cmd3, args=(commond,)).start()print("iproxy命令行已启动!")def get_session(mac_port):""" 访问Mac上的指定端口,获取指定IOS移动设备与Mac电脑的 session id。 """rs = http_get2('http://localhost:%s/status' % mac_port)if not rs.startswith('error'):rs_json = json.loads(rs, encoding='utf-8')session_id = rs_json['sessionId']return session_idstartup_wda(mac_port, udid)time.sleep(20)session_id = get_session(mac_port)return session_iddef get_source(mac_port, session_id):""" 获取source """rs = http_get2('http://localhost:%s/session/%s/source' % (mac_port, session_id))source = ''if not rs.startswith('error'):rs_json = json.loads(rs, encoding='utf-8')source = rs_json['value']return sourcedef write_source_xml(str_source, session_id):""" 将获取到的source写入xml文件 """source_xml = open(session_id + '_source.xml', 'w')source_xml.write(str_source)source_xml.close()print(session_id + '_source.xml文件创建成功!')def get_target(element_type, session_id, element_name):""" 从pagesource中获取目标控件的中间点。 """with open(session_id + '_source.xml', 'r', encoding='utf8') as fh:dom = minidom.parse(fh)root = dom.documentElement# XCUIElementTypeIcon XCUIElementTypeCelliconList = root.getElementsByTagName(element_type)for icon in iconList:name = icon.getAttribute('name')if element_name == name:x = int(icon.getAttribute('x'))y = int(icon.getAttribute('y'))width = int(icon.getAttribute('width'))height = int(icon.getAttribute('height'))breakreturn {"x": x+width/2,"y": y+height/2}def tap_by_name(session_id, mac_port, name):""" 使用POST请求,访问http://localhost:<mac_port>/session/wda/tap/0,进行点击目标控件。 """source = get_source(mac_port, session_id)if source != '':write_source_xml(source, session_id)if 'set' == name:req_data = get_target('XCUIElementTypeIcon', session_id, "设置")req_post(req_data, session_id, '/wda/tap/0', mac_port)source = "SUCCESS"elif 'Wi-Fi' == name:req_data = get_target('XCUIElementTypeCell', session_id, "Wi-Fi")req_post(req_data, session_id, '/wda/tap/0', mac_port)source = "SUCCESS"else:req_data = get_target('XCUIElementTypeCell', session_id, "无线局域网")req_post(req_data, session_id, '/wda/tap/0', mac_port)source = "SUCCESS"return sourceif __name__ == "__main__":mac_port = "8723"session_id = start_up_wda(mac_port, 'c259a97742e575999c9706a8b97cff7bf5046e9f')source = tap_by_name(session_id, mac_port, 'set')if source.startswith("SUCCESS"):print("'set'点击成功!")source = tap_by_name(session_id, mac_port, 'Wi-Fi')if source.startswith("SUCCESS"):print("'Wi-Fi'点击成功!")# 杀掉进程可以使用 $ kill -9 `lsof -t -i:port` 命令;该部分代码可以自行实现,或使用更好的关闭子进程方式。

Appium使用笔记整理及IOS的WDA工具的使用简介相关推荐

  1. 【笔记整理】图神经网络学习

    [笔记整理]图神经网络学习 文章目录 [笔记整理]图神经网络学习 一.GNN简介 1.图结构 & 图基础算法 1)引言("非欧几何, 处理图数据的NN") 2)图基本概念 ...

  2. 从0开始学Swift笔记整理(五)

    这是跟在上一篇博文后续内容: --Core Foundation框架 Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API.虽然在Sw ...

  3. 移动web——学习笔记整理

    目录 Day1 00.流式布局 00.1目标 00.2目录 01.移动端浏览器 02.视口(layout viewport) 03.meta视口标签(单标签) 04.物理像素&物理像素比 05 ...

  4. appium学习笔记

    appium学习笔记 第1节.2节课appium介绍和安装 开源.跨平台.多语言支持的移动应用自动化工具 测试对象 原生APP 混合APP 移动APP APP运行环境 真实设备 虚拟设备 测试程序语言 ...

  5. 整理常用iOS的第三方框架

    图像: 1.图片浏览控件MWPhotoBrowser        实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩 ...

  6. 初识JS_API基础Day4——笔记整理+JS运行机制+1课后作业+蓝瘦香菇...

    一. 常用的键盘事件 1. 键盘事件 2. 键盘事件对象 二. BOM 1 . 什么是BOM 2 . window对象的常见事件 页面(窗口)加载事件(2种) 第1种 window.onload 是窗 ...

  7. 笔记整理:狂神说java——java基础00

    笔记整理:狂神说java--Java基础00 笔记参考:b站狂神说java 视频链接:https://www.bilibili.com/video/BV12J41137hu?p=1 边学边写,欢迎浏览 ...

  8. 运维开发笔记整理-前后端分离

    运维开发笔记整理-前后端分离 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么要进行前后端分离 1>.pc, app, pad多端适应 2>.SPA开发式的流 ...

  9. 《繁凡的深度学习笔记》前言、目录大纲 一文让你完全弄懂深度学习所有基础(DL笔记整理系列)

    <繁凡的深度学习笔记>前言.目录大纲 (DL笔记整理系列) 一文弄懂深度学习所有基础 ! 3043331995@qq.com https://fanfansann.blog.csdn.ne ...

最新文章

  1. 优秀Java程序员应该知道的20个实用开源库
  2. 云服务器端口对外开放详解
  3. 利用老毛头启动盘重装win7
  4. base64 能放数组里面么_数组:总结篇
  5. Windows Server 2008 R2 建立iSCSI存储的教程(图文) Windows iSCSI(转)
  6. 01背包 (dp专题)
  7. 基于嵌入式操作系统VxWorks的多任务并发程序设计(4)――任务间通信A
  8. Kubernetes 小白学习笔记(7)--kubernetes的架构与组件-Node组件
  9. java——题型和考点大纲
  10. Word文档批量替换工具
  11. 能否利用Hadoop搭建完整的云计算平台
  12. 代码运行:CornerNet源码
  13. 马化腾教你做产品:改掉这七点,让产品自己说话
  14. 关于Xcode修改APP名称
  15. Leetcode_NO199_二叉树的左视图,右视图
  16. 邮箱格式,好用的商务邮箱推荐
  17. 商用车市场「跌跌不休」,主动安全「让位」智能驾驶?
  18. linux系统有哪些手机,li手机操作系统排行_linux操作系统排行
  19. selenium+Java同时开启多个浏览器并行测试用例
  20. 踩实底子|每日学习|02-特征工程和文本特征提取【下】

热门文章

  1. python 的继承顺序
  2. 数据校验@Validated(解决javax.validation.ConstraintViolationException问题)
  3. SurfaceView小结
  4. Qt学习——利用QToolBox实现QQ好友列表
  5. 鼠标拖拽调整div大小
  6. 手把手教你考研《数据结构》代码题
  7. 大师兄 常用网站 记录
  8. unity 内存释放分析
  9. 通过这次疫情,互联网行业会给我们带来哪些新的发展趋势与机遇?
  10. C# System.Runtime.InteropServices.COMException: 内存资源不足,无法处理此命令。 (异常来自 HRESULT:0x80070008)