appium ,selenium ,webdriver 运行原理与机制

 作测试开发的童鞋都知道,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的原理是什么? 长链接短链接是什么意思,下个博客总结:

Selenium2 

Selenium是一个用于Web应用程序测试的工具,支持多平台、多浏览器、多语言去实现自动化测试,Selenium2将浏览器原生的API封装成WebDriver API,能够直接操做浏览器页面里的元素,甚至操做浏览器自己(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的),因此就像真正的用户在操做同样。

Webdriver的一个简单的架构图,以下图所示:

 

WebDriver的工做原理图:

在咱们new一个WebDriver的过程:
1. Selenium首先会确认浏览器的native component是否存在可用并且版本匹配(selenium版本对应到 不一样的浏览器driver版本)。
2.在目标浏览器里启动一整套Web Service(实际上就是浏览器厂商提供的driver, 好比IEDriver, ChromeDriver,它们都实现了 WebDriver's wire protocol),
3.这套Web Service使用了Selenium本身设计定义的协议,名字叫作 The WebDriver Wire Protocol。这套协议很是之强大,几乎能够操做浏览器作任何事情,包括打 开、关闭、最大化、最小化、元素定位、元素点击、上传文件等等等等。
 

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,根据返回值就能判断对浏览器的操做是否是执行成功

 

举个实际的例子:

WebDriver diver = new FirefoxDriver();
driver.get("http://google.com");
 
在执行 driver.get("http://google.com");  这句代码时,client也就是咱们的测试代码向Web Service(remote server)发送了以下的请求:
POST session/285b12e4-2b8a-4fe6-90e1-c35cba245956/url
post_data {"url":"http://google.com"} 
 
经过post的方式请求localhost:port/hub/session/session_id/url地址,请求浏览器完成跳转url的操做。
 
若是上述请求是可接受的,或者说Web Service是实现了这个接口,那么Web Service会跳转到该post data包含的url,并返回以下的response
{"name":"get","sessionId":"285b12e4-2b8a-4fe6-90e1-c35cba245956","status":0,"value":""}
 
该response中包含以下信息
name:Web Service端的实现的方法的名称,这里是get,表示跳转到指定url;
sessionId:当前session的id;
status:请求执行的状态码,非0表示未正确执行,这里是0,表示一切ok没必要担忧;
value:请求的返回值,这里返回值为空,若是client调用title接口,则该值应该是当前页面的title;
 
若是client发送的请求是定位某个特定的页面元素,则response的返回值多是这样的:
{"name":"findElement","sessionId":"285b12e4-2b8a-4fe6-90e1-c35cba245956","status":0,"value":{"ELEMENT":"{2192893e-f260-44c4-bdf6-7aad3c919739}"}}
 
name,sessionId,status跟上面的例子是差很少的,区别是该请求的返回值是ELEMENT:{2192893e-f260-44c4-bdf6-7aad3c919739},表示定位到元素的id,经过该id,client能够发送如click之类的请求与server端进行交互。
 
 
 

APPIUM运行原理:

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)。

相关文章
相关标签/搜索