Appium、Selenium、Webdriver的运行原理与机制

mac2025-02-28  3

说起UI自动化测试,我们基本需要掌握Appium、Selenium、Webdriver这几种测试框架,那么这三者之间有什么联系,他们的原理是什么呐? 简单来说就是: Selenium2就是将浏览器原声的API封装成Webdriver API,Webdriver是基于http协议的 Appium是基于Webdriver协议添加对移动设备自动化api扩展而成的,基于tcp/ip协议 推论: 凡是牵扯到客户端和服务器交互的,都有http协议 凡是牵扯到移动端交互的,都是tcp/ip协议(封装成socket接口)

面试时如何口述Selenium原理? 答案:Selenium是将各个浏览器的API封装成“Selenium自己设计定义的协议,名字叫做The WebDriver Wire Protocol”的webdriver API 操作层面: 1、测试人员编写UI自动化测试脚本(java、python等等),运行脚本后,程序会打开指定的webdriver浏览器。 2、webdriver浏览器座位一个remote-server接受脚本的命令,同时webservice会打开一个端口:http://localhost:46350 浏览器则会监听这个端口。 3、webservice会将脚本语言翻译成json格式传递给浏览器执行操作命令。 逻辑层面: 1、测试人员执行测试脚本后,就创建了一个session,通过http请求想webservice发送了restfull的请求。 2、webservice翻译restfull的请求为浏览器能懂的脚本,然后接受脚本执行结果。 3、webservice将结果进行封装–json给到客户端client测试脚本,然后client就知道操作是否成功,同样测试也可以进行校验了。

口述appium的原理 appium-ios和安卓都差不多,分pc和手机两块讲: 1、首先是PC端,测试人员执行测试脚本,通过appium client转换为json格式传递给appium server。 2、appiumserver启动了一个监听端口例如 4724,同时想手机端adb push一个bootstrap.jar/bootstrap.js的脚本,手机端可以通过该脚本同时监听端口 4724。 3、PC和手机端就通过这个端口实现了通信和交互,基于socket通信(一个封装了TCP/IP协议的接口)。 4、手机端可以通过该接口传输的命令执行APP,boostrap里面封装了安卓和苹果的自动化测试框架UIautomator执行相应的命令。 5、执行完操作后通过端口返回给PC端,PC端根据返回结果json做校验,同时也知道了操作是否执行成功。

Selenium2

Selenium是一个用于web应用程序测试的工具,支持多平台、多浏览器、多语言去实现自动化测试,Selenium2将浏览器原生的API封装成WebDirver API,可以直接操作浏览器页面里面的元素,甚至操作浏览器本身(截屏、窗口大小、启动、关闭、安装插件、配置证书等等),所以就像真正的用户在操作一样。

webdriver的一个简单的架构图: 在我们new一个WebDriver的过程: 1、Selenium首先会确认浏览器的native component是否存在可用而且版本匹配(selenium版本对应到不同的浏览器driver版本)。 2、在目标浏览器里启动一整套Web Service(实际上就是浏览器厂商提供的dirver,比如IEDriver、ChromeDriver,他们都实现了WebDriver’s wire protocol)。 3、这套WebService使用了Selenium自己设计定义的协议,名字叫做The WebDriver Wire Protocol

可以更通俗的理解:由于客户端脚本(java、python)不能直接与浏览器通信,这个时候可以把webservice当成一个翻译器,它可以把客户端代码翻译成浏览器可以识别的代码如:js。客户端创建一个session,在该session中通过http请求想webservice发送restful请求,webservice翻译成浏览器懂得脚本传给浏览器,浏览器把执行的结果返回给webservice,webservice把返回的结果做了一些封装(一般都是json格式),然后返回给client,根据返回值就能判断对浏览器的操作是不是执行成功。

举个实际的例子:

WebDriver dirver = new FireFoxDriver(); dirver.get("http://google.com");

在执行dirver.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:WebService端的实现的方法的名称,这里是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告知服务端相关测试信息

appium ios封装了apple的instruments框架

最新回复(0)