读懂appium原理,看这篇就够了

读懂appium原理,看这篇就够了,第1张

话不多说,直接上干货:

appium的整体架构是C/S模式,整体流程(返回顺序为逆向):

脚本请求 ——>4723端口appium server ——>解析参数给PC端4724端口 ——>发送给设备4724端口 ——> 通过设备4724端口发给bootstrap.jar ——> Bootstrap.jar把命令发给uiautomator

1、脚本请求 ——>4723端口appium server :

首先我们要开启appium服务,即Appium server,也就是在命令行用appium命令打开的东西,默认监听4723端口。4723端口专门和脚本打交道,基于WebDriver协议。webdriver是按照server – client的经典设计模式设计的,作用就是启动基于WebDriver Wire协议的appium服务,接下来脚本与appium server的通信实际上是一个HTTP request请求给appium server,在请求的body中,会以WebDriver Wire协议规定的 JSON 格式的字符串来告诉appium服务我们希望设备接下来做什么事情。读到这里,难免有同学会有疑问了,因为有一些文档上面说脚本发送请求是基于Json wire protocol协议的,首先这是完全正确的,接下来就解释一下:

appium中的Json wire protocol继承自selenium的webdriver wire protocol,并进行了扩展,使得Json wire protocol能够控制不同的移动设备的行为。如果大家觉得对于webdriver这个名词觉得比较陌生的话,接下来说一个词肯定熟悉 - Selenium。Selenium是一个浏览器自动化操作框架。Selenium主要由三种工具组成。第一个工具SeleniumIDE,是Firefox的扩展插件,支持用户录制和回访测试,录制/回访模式存在局限性,对许多用户来说并不适合,因此第二个工具——Selenium WebDriver提供了各种语言环境的API来支持更多控制权和编写符合标准软件开发实践的应用程序。最后一个工具——SeleniumGrid帮助工程师使用Selenium API控制分布在一系列机器上的浏览器实例,支持并发运行更多测试。在项目内部,它们分别被称为“IDE”、“WebDriver”和“Grid”。

那么webdriver wire protocol又是什么呢:

在我们创建一个WebDriver的过程中,Selenium首先会确认浏览器的native component是否存在可用而且版本匹配。接着就在目标浏览器里启动一整套Web Service,这套Web Service使用了Selenium自己设计定义的协议,名字叫做 The WebDriver Wire Protocol, 只不过对应到我们这里的浏览器指的是Appium。

WebDriver Wire协议是通用的,也就是说不管是FirefoxDriver还是ChromeDriver,启动之后都会在某一个端口启动基于这套协议的Web Service。对应到Appium,可以理解为是AppiumDriver。接下来,我们调用WebDriver的任何API,都需要借助一个 ComandExecutor 发送一个命令,实际上是一个HTTP request给端口上的Web Service。在我们的HTTP request的body中,会以WebDriver Wire协议规定的 JSON 格式的字符串来告诉Selenium我们希望浏览器(设备)接下来做什么事情。

说到这里可能会有疑问了,上面说到的是脚本请求对设备进行操作,但前提是,我们要对谁进行操作测试呢?这里就引入一个新名词:desiredCapabilities。了解了上述之后,再去看脚本怎么将desiredCapabilities传递给appium server就明白多了,脚本通过Json Wire Protocol协议以json格式发送测试设备信息给server端,测试设备信息被携带在Desired Capabilities中,这个东西实质上是一个key-value形式的对象,Desired Capabilities最重要的作用是告诉server本次测试的上下文。这次是要进行浏览器测试还是移动端测试?如果是移动端测试的话是android还是ios?如果android的话我们要测试哪个app?server的这些疑问Desired Capabilities都必须给予解答,否则server不买账,针对我们现在所说的安卓,它带来的影响就是无法完成app的启动。

那么,将测试设备信息告知之后,是不是就可以开始进行测试了呢?答案是:NO。这里又要引入一个名词:session。session就是一个会话,在webdriver/appium,你的所有工作永远都是在session start后才可以进行的。client 创建1个session,在该session中通过http向appium server发送请求,appium server解析请求,完成相应操作并返回response。

Session在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息,对应到这里其实就是desiredCapabilities中的配置信息参数。脚本通过POST /session这个URL,然后传入Desired Capabilities就可以开启session了,由于这是第一次请求创建session,所有并没有一个已创建的session id,所以appium server会调用android driver(appium升级到2.0.0后,原有的AppiumDriver函数变成抽象函数了,需更改为AndroidDriver)为client生成一个session并且生成一个与此session相关联的session id,这个 session id将被在本次响应中返回给客户端保存,当下次脚本发出操作请求时就会自带session id为唯一标识,代表所打开的设备,Appium server会按照此session id把这个session检索出来使用,脚本向appium server发送的请求即是存在于创建的session中的。

Session 的作用就是它在appium服务上保持设备的状态信息,供在任何时间进行访问,在多次的操作行为中,存储在 Session对象中的配置信息将不会丢失,而是在整个用户会话中一直存在下去,整个测试进程中设备与程序的联系不会断开,也不需要每次都发送带配置信息的请求,程序都知道对哪个设备进行测试操作。当测试结束后,需关闭webdriver,driver.quit()会关闭所有关联窗口和session,并且也会把进程也关闭。

2、解析参数给PC端4724端口 ——>发送给设备4724端口 ——> 通过设备4724端口发给bootstrap.jar ——> Bootstrap.jar把命令发给uiautomator:

创建session成功之前,就已将bootstrap.jar放入手机中,并开启设备上的基于appium bootstrap的socket服务,绑定本机和boostrap通信的端口号4724用于和Android设备通讯,默认监听4724端口,等待client的连接。

Appium server将脚本的请求解析后给到4724端口,通过设备的4724端口转发解析后的请求, 此时,对于socket服务来说,appium server就充当了client的角色,appium server通过4724端口主动去请求设备上的socket服务,即向socket服务发送请求,即bootstrap.jar,Bootstrap.jar再把Appium的命令转换成uiautomator的命令来让uiautomator进行处理。有请求就有返回,socket接收到请求后会做出响应,原路返回给脚本,然后脚本再进行下一次的请求。

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。appium和手机的通信过程,主要是数据交换的一个过程,socket的作用是就是为了实现双向通信,它需要一对端口号,对应到这里就是4724,手机端的bootstrap就是socket-server端,appium server就是socket-client端。

关于socket的通信原理,先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

**锁定解锁屏幕 **

driver.lock(5)

将把当前应用放到后台 5 秒

driver.background_app(5)

**收起键盘 **

driver.hide_keyboard()

启动 ACTIVITY

在当前应用中打开一个 activity 或者启动一个新应用并打开一个 activity 。 只能在 Android 上使用

driver.start_activity('com.example.android.apis', '.Foo')

打开下拉通知栏 只能在 Android 上使用

driver.open_notifications()

**检查应用是否已经安装 **

driver.is_app_installed('com.example.android.apis')

安装应用

driver.install_app('path/to/my.apk')

**删除应用 **

driver.remove_app('com.example.android.apis')

**摇晃 (SHAKE) 关闭应用 **

driver.shake()

**关闭应用 **

driver.close_app()

启动 (LAUNCH)

根据服务关键字 (desired capabilities) 启动会话 (session) 。请注意这必须在设定 autoLaunch=false 关键字时才能生效。这不是用于启动指定的 app/activities ————你可以使用 start_activity 做到这个效果————这是用来继续进行使用了 autoLaunch=false 关键字时的初始化 (Launch) 流程的

driver.launch_app()

**应用重置(相当于卸载重装应用) **

driver.reset()

列出所有的可用上下文 (CONTEXT)

context 可以理解为 可进入的窗口 。例如,对于原生应用,可用的 context 和默认 context 均为 NATIVE_APP

driver.contexts

**列出当前上下文 **

driver.current_context

**获取当前页面的源码(可以辅助元素定位) **

driver.page_source

**截图屏幕图片 **

driver.get_screenshot_as_file(r'E:\img\img1.png') # 截取整个屏幕

获取应用程序的字符串 (APP STRINGS)

driver.app_strings

给设备发送一个按键事件(KEY EVENT)(只限安卓)

driver.keyevent(176)

获取当前 activity。只能在 Android 上使用

driver.current_activity

模拟用户滑动(SWIPE)

driver.swipe(start=75, starty=500, endx=75, endy=0, duration=800)

捏屏幕(PINCH) (双指往内移动来缩小屏幕)

driver.pinch(element=el)

放大 (ZOOM)屏幕 (双指往外移动来放大屏幕)

driver.zoom(element=el)

**滑动 (SCROLL)到某个元素。从一个元素滚动到另一个元素 **

driver.scroll(originalEl, destinationEl ) # originalEl - 要滚动的元素 destinationEl - 要滚动到的元素

**设置元素的值 **

driver.set_value(element=el,Val) # 设置 el 元素的值

推送文件到设备中去(PUSH FILE),推送文件需要转换为'base64'

**获取/设置 appium 的服务器设置。 **

**多个点点击(最多五个点) **

driver.tap([(100, 20), (100, 60), (100,100)], 500) # list 中的元组放 5 个点,500 表示按下 500ms

这个时候总是无奈的说:

你应该学习Python 或是Java

你应该掌握Selenium

又或者你需要学会jmeter,嗯,可能LoadRunner你应该学习

也许SoapUI是个不错的选择,或者你可是试试PostMan

......

其实这些都不是我真正的答案,我想说:只专注于一种编程语言或一种工具可能限制你的发挥,尤其可能限制了你在工作中提供的价值。如果你提供的价值在逐步退化,那么你的舞台可能突然谢幕,你的职业停滞不前,受到限制。

所以,什么最重要?当然是能力了!

下面我就介绍下2019最好用的10个自动化测试工具,希望可以充实你的知识库,打开你的职业发展舞台!

在自动化测试领域,自动化工具的核心地位毋庸置疑。我总结了最顶尖的自动化测试工具,这些工具可以帮助组织更好地定位自己,跟上软件测试的趋势。这份清单包含了开源和商业的自动化测试解决方案。

Selenium:WebUI自动化测试

Selenium是网页应用中最流行的开源自动化测试框架。起源于2000年,10多年来不断地完善,Selenium成为许多Web自动化测试人员的选择,尤其是那些有高级编程和脚本技能的人。Selenium也成为了其他开源自动化测试工具比如Katalon Studio,Watir,Protractor和Robot Framework的核心框架。

Selenium 支持多系统环境(Windows,Mac,Linux)以及多种浏览器(Chrome,FireFox,IE以及无头浏览器(没有界面))。它的脚本可以由各种各样的编程语言编写,比如 Java,Groovy,Python,C#,PHP,Ruby 以及 Perl。

因为Selenium的灵活性,测试人员可以写各种复杂的、高级的测试脚本来应对各种复杂的问题,它需要高级的编程技能和付出来构建满足自己需求的自动化测试框架和库。

Appium:APP UI自动化测试

Appium是一个移动端自动化测试开源工具,支持iOS和Android平台,支持Python、Java等语言,即同一套Java或Python脚本可以同时运行在iOS和Android平台,Appium 是一个C/S架构,核心是一个Web服务器,它提供了一套REST的接口。当收到客户端的连接后,就会监听到命令,然后在移动设备上执行这些命令,最后将执行结果放在HTTP响应中返还给客户端。

Jmeter:接口测试,性能测试

JMeter是一个开源的Java桌面应用程序,主要用于web应用程序的负载测试。它还支持单元测试和有限的功能测试。

它有很多好的特性,比如动态报告、可移植性、强大的测试IDE等,并且支持不同类型的应用程序、协议、shell脚本、Java对象和数据库。

Postman:接口测试

Postman 提供功能强大的Web API和HTTP请求的调试,它能够发送任何类型的HTTP请求 (GET, POST, PUT, DELETE…),并且能附带任何数量的参数和Headers。不仅如此,它还提供测试数据和环境配置数据的导入导出,付费的Post Cloud用户还能够创建自己的 Team Library用来团队协作式的测试,并能够将自己的测试收藏夹和用例数据分享给团队。

SoapUI:接口测试

SoapUI是一个非常流行的用于SOAP和REST的开源API测试自动化框架。它还支持功能测试、性能测试、数据驱动测试和测试报告。

Monkey:稳定性测试

软件附带在sdk中,适用于android和ios,通过adb shell,生成用户或系统的伪随机事件。压力测试结果:崩溃crash,无响应anr,基本命令:adb shell monkey 1000。

Robot Framework:Web UI自动化测试,接口测试

Robot Framework是一个开源自动化框架,它实现了用于验收测试和验收测试驱动开发(ATDD)的关键字驱动方法。Robot Framework为不同的测试自动化需求提供框架。但是,通过使用Python和Java实现其他测试库,可以进一步扩展其测试功能。Selenium WebDriver是Robot Framework中常用的外部库。

测试工程师可以利用Robot Framework作为自动化框架,不仅可以进行Web测试,还可以用于Android和iOS测试自动化。对于熟悉关键字驱动测试的测试人员,可以轻松学习Robot Framework。

QTP:Web UI自动化测试

QTP是一种自动测试工具。使用 QTP 的目的是想用它来执行重复的手动测试,主要是用于回归测试和测试同一软件的新版本。因此你在测试前要考虑好如何对应用程序进行测试,例如要测试那些功能、操作步骤、输入数据和期望的输出数据等。

QTP针对的是GUI应用程序,包括传统的Windows应用程序,以及现在越来越流行的Web应用。它可以覆盖绝大多数的软件开发技术,简单高效,并具备测试用例可重用的特点。其中包括:创建测试、插入检查点、检验数据、增强测试、运行测试、分析结果和维护测试等方面。

LoadRunner:性能测试

LoadRunner,是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试。

企业使用LoadRunner能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。LoadRunner可适用于各种体系架构的自动负载测试,能预测系统行为并评估系统性能。

Jenkins:持续集成

自动化构建编译,部署,任务执行,测试报告,邮件通知等。

使用开源测试工具有很多好处,尤其是无直接的购买成本,而且可定制,但也有一定的局限性。尤其是缺乏专业的技术支持,有限的许可支持以及脚本维护有时会成为一个挑战性的工作。

为了选择正确的自动化测试工具,你应该确保该工具是处于活跃维护状态的,并且与你所在企业业务、团队、技能匹配,并且是团队里有相应的专家。

因此在选择工具之前,你必须仔细研究,以便该工具能够满足你的测需求,并且能帮助你更好的执行测试。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/470984.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-06
下一篇2023-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存