作测试开发的童鞋都知道,UI自动化你绕不开selenium, webdrvier, appium框架,那么这三者之间有什么关联,它们的原理是什么呢?java
简单来讲就是:python
Selenium2 将浏览器原生的API封装成WebDriver API ,webdriver 是基于 http协议的;ios
appium是基于 webdriver 协议添加对移动设备自动化api扩展而成的,基于tcp/ip协议(使用了socket接口)web
推论: 凡是牵扯到客户端和服务器交互的,都有Http 协议面试
凡是牵扯到移动端社保的,都有tcp/ip 协议(封装成socket接口)json
面试的时候如何口述Selenium 原理?bootstrap
Selenium 是将各个浏览器的API封装成" Selenium本身设计定义的协议,名字叫作The WebDriver Wire Protocol " 的webdriver API api
操做层面:浏览器
一、测试人员编写UI自动化测试脚本(java,python等等),运行脚本后,程序会打开指定的webdriver浏览器ruby
2. webdriver浏览器做为一个remote-server 接受脚本的命令,同时webservice会打开一个端口:http://localhost:46350 浏览器则会监听这个端口
二、webservice会将脚本语言翻译成json格式传递给浏览器执行操做命令
逻辑层面:
一、测试人员执行测试脚本后,就建立了一个session, 经过http 请求向webservice发送了restfull的请求。
二、webservice翻译restfull的请求为浏览器能懂的脚本,而后接受脚本执行结果。
三、webservice将结果进行封装--json 给到客户端client/测试脚本 ,而后client就知道操做是否成功,同时测试也能够进行校验了。
口述appium的原理:
appium-IOS 和安卓都差很少,有细小差异,分PC和手机两块讲:
一、首先是PC端, 测试人员执行测试脚本(java,python等脚本)经过appium client 转换为json格式传递给appium server
二、 appiumserver 启动了一个监听端口例如4724, 同时向手机端adb push 一个bootstrap.jar/bootstrap.js 的脚本,手机端经过该脚本同时监听端口4724
三、PC和手机端就经过这个端口实现了通讯和交互,基于socket通讯(一个封装了TCP/IP协议的接口)
四、手机端经过该端口传输的命令执行APP, bootstrap里面封装了安卓和苹果的自动化测试框架UIautomator(低版本的安卓是instrumentation ) 执行相应的命令
五、执行完操做后经过端口返回给PC端,PC端根据返回结果 json 作校验,同时也知道了操做是否执行成功
因此UI自动化的底层仍是webdriver ,它是基于HTTP协议的,那么HTTP的原理是什么? 长链接短链接是什么意思,下个博客总结:
Selenium是一个用于Web应用程序测试的工具,支持多平台、多浏览器、多语言去实现自动化测试,Selenium2将浏览器原生的API封装成WebDriver API,能够直接操做浏览器页面里的元素,甚至操做浏览器自己(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的),因此就像真正的用户在操做同样。
Webdriver的一个简单的架构图,以下图所示:
WebDriver Wire协议是通用的,也就是说不论是FirefoxDriver仍是ChromeDriver,启动以后都会在某一个端口启动基于这套协议的Web Service。例如FirefoxDriver初始化成功以后,默认会从http://localhost:7055开始,而ChromeDriver则大概是http://localhost:46350之类的。接下来,咱们调用WebDriver的任何API,都须要借助一个ComandExecutor发送一个命令,其实是一个HTTP request给监听端口上的Web Service。在咱们的HTTP request的body中,会以WebDriver Wire协议规定的JSON格式的字符串来告诉Selenium咱们但愿浏览器接下来作什么事情。
能够更通俗的理解:因为客户端脚本(java, python, ruby)不能直接与浏览器通讯,这时候能够把WebService当作一个翻译器,它能够把客户端代码翻译成浏览器能够识别的代码(好比js).客户端(也就是测试脚本)建立1个session,在该session中经过http请求向WebService发送restful的请求,WebService翻译成浏览器懂得脚本传给浏览器,浏览器把执行的结果返回给WebService,WebService把返回的结果作了一些封装(通常都是json格式),而后返回给client,根据返回值就能判断对浏览器的操做是否是执行成功
举个实际的例子:
Appium是 c/s模式的
appium是基于 webdriver 协议添加对移动设备自化api扩展而成的
webdriver 是基于 http协议的,第一链接会创建个 session 会话,并经过 post发送一个 json 告知服务端相关测试信息
IOS 原理图
appium ios封装了 封装了 封装了 apple 的 Instruments 框架,主要用了 Instrument里的 UIAutomation(Apple 的自动化测试框架),而后在设备中注入 bootstrap.js 进 行监 听。
Client ent是咱们编写的 webdriver脚本 ,中间是 appium启动 server (默认监听 4723 端口 ),
appium server 调用 instruments.js启动一个 socket server ,同时分出一个 子进程运⾏instruments.app 将 bootstrap.js(一个 UIAutomation 脚本)注 ⼊入到 devices⽤于和外界进行交 。
最后 Bootstrap.js将执行的结果返回给 将执行的结果返回给 appium server ,appium server再将结果返回给 appium client 。
Android原理图
4.2 之后是基于 uiautomator框架实现查找注入事件的, 框架实现查找注入事件的,框架实现查找注入事件的, 4.2 之前则是 instrumentation i框架的,并封装成一个叫 Selendroid 这玩意提供服务
Client ent是咱们编写的 webdriver 脚本。中间是 appium启动 server (默认监听 4723 端口 ),
appium server 会把请求转发给中间件 会把请求转发给中间件 Bootstrap.jar ,它是用java写的,安装在手机上 .Bootstrap监听 4723端口并接收appium 的命令,最终经过调用 UiAutomator 的命令来实现。Bootstrap将执行的结果返回给返回给 appium server 。Appiumserver再将结果返回给 client端(PC)。