selenium和appium内部原理总结
为什么会有这篇文章?
前段时间学习了selenium的使用,今天开始接触appium看到appium的原理后产生了疑惑:
现在的selenium是通过webdriver来操作驱动浏览器的,然而appium有一个server的概念
那么为什么没有app driver这个东西呢?
selenium
早期的selenium
早期的selenium主要是指selenium1.0的版本,
这个版本主要由Selenium IDE + Selenium Grid + SeleniumRC组成
seleniumRC就是后来被webdriver取代的一个代理server
RC == Remote Control 远程控制
早期Selenium 引入了 Remote Control Server 这样一个代理 Server,JavaScript 脚本注入和与 Server 通讯都通过这个代理 Server 来进行,JavasScript可以获取并调用页面的任何元素,Selenium启动一个Server,将操作Web元素的API调用转化为一段段JavaScript,在Selenium内核启动浏览器之后注入这段JS
缺点:但是JS注入速度不理想,稳定性大大依赖于Selenium内核对API翻译成的JS质量高低
引入代理Remote Control Server是因为“同源策略”的限制,通过这个代理服务器来“欺骗”远程Server,达到使其以为是从同一个地方load代码以正确返回请求数据的效果
seleniumRC的原理
- Selenium RC Server 启动一个浏览器(或是已经使用中),并注入js代码
- 将测试脚本代码传到客户端的 Selenium-Core 中
- Selenium-Core 翻译并解析执行用户录制的操作
- 让代理 Server 进行通讯
- Remote Control Server 负责跟远程 Web 应用服务器进行通讯
seleniumRC的组成
- Selenium Server(Launcher、Http Proxy、Selenium Core)
- Client Libraries(用来控制server)
seleniumRC的工作流程
- 测试用例通过Client Libraries的接口向Selenium Server发送Http请求,要求和Selenium Server建立连接
- Selenium Server的Launcher启动浏览器,把Selenium Core加载入浏览器页面中,并发浏览器的代理设置为Selenium Server的Http Proxy。
- 测试用例通过Client Libraries的接口向Selenium Server发送Http请求,Selenium Server对请求进行解析,然后通过Http Proxy发送JS命令通知Selenium Core执行操作浏览器的动作
- Selenium Core接收到指令后,执行操作
- 浏览器收到新的页面请求信息,于是发送Http请求,请求新的web页面。Selenium Server会接收到所有由它启动的浏览器发动的请求
- Selenium Server接收到浏览器发送的Http请求后,自己重组Http请求,获取对应的web页面
- Selenium Server的Http Proxy把接收的Web页面返回给浏览器
现在的selenium
selenium3.0以后移除了seleniumRC,取而代之的是webdriver
用一张图来展示selenium3.0的运行原理
这里讲到的是测试脚本和浏览器的交互,客户端开始运行驱动浏览器的脚本的时候,这时浏览器收到请求开始启动并开启侦听端口,并自动创建session,保持浏览器和对应客户端的会话连接,然后客户端运行脚本,向浏览器发送http请求,浏览器解析请求,根据脚本内容做出相应操作,返回response。这时客户端根据response选择结束还是继续执行
tips:
- webdriver操作浏览器、页面采用的协议:the webdriver wire protocol
- Client和Server的通信协议:HTTP
- HTTP传输的数据内容为遵循WP协议json格式数据
- 浏览器驱动实现了webdriver协议的api
appium
appium和selenium之间的不同
appium本身就是一个server,而selenium废弃了server,用webdriver来驱动浏览器
appium工作原理
当开启appium服务器的同时就开启了监听端口;我们运行脚本的时候,调用任何的appiumAPI,都会向Appium Server端post一条HTTP请求,请求内容就是根据webdriver wire protocol协议规定的一条JSON格式的数据;Appium Server端接收到请求后,解析出JSON数据并发送到手机端;手机端上已经由BootStrap.jar(iOS为BootStrip.js)开启的socket服务器监听相应的端口,BootStrap.jar在appium每个session第一次访问手机端的时候会自动安装;手机端接收到对应的请求后,通过BootStrap.jar翻译成UIAutomator能执行的命令,然后通过UIAutomator处理并操作APP完成测试。
appium的几个概念
- appium/appium server
一般所说的appium其实是一个基于node.js的web服务器,它是测试脚本和设备端交互的桥梁
用npm install -g appium 安装的是命令行的没有界面的appium server
- appium GUI
它是把没有界面的appium server封装出了一个图形界面,方便操作,但是现在已经被appium desktop所取代
- appium Desktop
它是一款适用于Mac,Windows和Linux的开源应用程序,它以美观而灵活的用户界面为您提供appium server的强大功能
- appium client
第1点中说到,appium其实是一个sweb server,server是接收请求来操作设备端的app的,既然有了server那么一定会有client
这个client就是我们写测试脚本时导入的包
python中可以运行 pip install Appium-Python-Client 来安装
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。