【转】selenium及webdriver的原理

主要内容转自:http://blog.csdn.net/ant_ren/article/details/7968582http://blog.csdn.net/ant_ren/article/details/7970793

selenium与webdriver整合后,形成的新的测试工具叫做selenium2.x。在selenium1时间,selenium使用javascript来达到测试自动化的目标。

1. selenium RC

早期的Selenium使用的是Javascript注入技术与浏览器打交道,需要Selenium RC启动一个Server,将操作Web元素的API调用转化为一段段Javascript,在Selenium内核启动浏览器之后注入这段Javascript。开发过Web应用的人都知道,Javascript可以获取并调用页面的任何元素,自如的进行操作。由此才实现了Selenium的目的:自动化Web操作。这种Javascript注入技术的缺点是速度不理想,而且稳定性大大依赖于Selenium内核对API翻译成的Javascript质量高低。

2. WebDriver

当Selenium2.x 提出了WebDriver的概念之后,它提供了完全另外的一种方式与浏览器交互。那就是利用浏览器原生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)。由于使用的是浏览器原生的API,速度大大提高,而且调用的稳定性交给了浏览器厂商本身,显然是更加科学。然而带来的一些副作用就是,不同的浏览器厂商,对Web元素的操作和呈现多少会有一些差异,这就直接导致了Selenium WebDriver要分浏览器厂商不同,而提供不同的实现。例如Firefox就有专门的FirefoxDriver,Chrome就有专门的ChromeDriver等等。(甚至包括了AndroidDriver和iOS 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我们希望浏览器接下来做社么事情。

在我们new一个WebDriver的过程中,Selenium首先会确认浏览器的native component是否存在可用而且版本匹配。接着就在目标浏览器里启动一整套Web Service,这套Web Service使用了Selenium自己设计定义的协议,名字叫做The WebDriver Wire Protocol。这套协议非常之强大,几乎可以操作浏览器做任何事情,包括打开、关闭、最大化、最小化、元素定位、元素点击、上传文件等等等等。

这里笔者初步画了一个图来表示各种WebDriver的工作原理:


从上图中我们可以看出,不同浏览器的WebDriver子类,都需要依赖特定的浏览器原生组件,例如Firefox就需要一个add-on名字叫webdriver.xpi。而IE的话就需要用到一个dll文件来转化Web Service的命令为浏览器native的调用。另外,图中还标明了WebDriver Wire协议是一套基于RESTful的web service。如果不明白什么是RESTful的,可以参见笔者之前另外一篇介绍REST的blog(http://blog.csdn.net/ant_yan/article/details/7963517)

关于WebDriver Wire协议的细节,比如希望了解这套Web Service能够做哪些事情,可以阅读Selenium官方的协议文档, 在Selenium的源码中,我们可以找到一个HttpCommandExecutor这个类,里面维护了一个Map<String, CommandInfo>,它负责将一个个代表命令的简单字符串key,转化为相应的URL,因为REST的理念是将所有的操作视作一个个状态,每一个状态对应一个URI。所以当我们以特定的URL发送HTTP request给这个RESTful web service之后,它就能解析出需要执行的操作。截取一段源码如下:

nameToUrl = ImmutableMap.<String, CommandInfo>builder()  
        .put(NEW_SESSION, post("/session"))  
        .put(QUIT, delete("/session/:sessionId"))  
        .put(GET_CURRENT_WINDOW_HANDLE, get("/session/:sessionId/window_handle"))  
        .put(GET_WINDOW_HANDLES, get("/session/:sessionId/window_handles"))  
        .put(GET, post("/session/:sessionId/url"))  
  
            // The Alert API is still experimental and should not be used.  
        .put(GET_ALERT, get("/session/:sessionId/alert"))  
        .put(DISMISS_ALERT, post("/session/:sessionId/dismiss_alert"))  
        .put(ACCEPT_ALERT, post("/session/:sessionId/accept_alert"))  
        .put(GET_ALERT_TEXT, get("/session/:sessionId/alert_text"))  
        .put(SET_ALERT_VALUE, post("/session/:sessionId/alert_text"))  

可以看到实际发送的URL都是相对路径,后缀多以/session/:sessionId开头,这也意味着WebDriver每次启动浏览器都会分配一个独立的sessionId,多线程并行的时候彼此之间不会有冲突和干扰。例如我们最常用的一个WebDriver的API,getWebElement在这里就会转化为/session/:sessionId/element这个URL,然后在发出的HTTP request body内再附上具体的参数比如by ID还是CSS还是Xpath,各自的值又是什么。收到并执行了这个操作之后,也会回复一个HTTP response。内容也是JSON,会返回找到的WebElement的各种细节,比如text、CSS selector、tag name、class name等等。以下是解析我们说的HTTP response的代码片段:

try {  
        response = new JsonToBeanConverter().convert(Response.class, responseAsText);  
      } catch (ClassCastException e) {  
        if (responseAsText != null && "".equals(responseAsText)) {  
          // The remote server has died, but has already set some headers.  
          // Normally this occurs when the final window of the firefox driver  
          // is closed on OS X. Return null, as the return value _should_ be  
          // being ignored. This is not an elegant solution.  
          return null;  
        }  
        throw new WebDriverException("Cannot convert text to response: " + responseAsText, e);  
      } //...  

相信总结道这里,应该对WebDriver的运行原理应该清楚了!其实挺佩服这一套RESTful web service的设计。感觉封装WebDriver暴露出来的public API还可以更加友好跟强大一点,这次就先总结道这里,会继续分析Selenium源码,继续分享的!

3. 使用selenium2.x的经验总结

其中WebDriver的更加面向对象的方式大大降低了Selenium的入门门槛,对Web元素的操作也非常之简单易学。实际项目用起来,工作量最大的部分就是你如何解析定位到你的目标项目页面中的各种元素。好比你要定位一个Button,你可以用ID,可以用CSS,可以用XPATH,你为了点击这个Button,写了一个函数调用Selenium里的API,即WebElement里的click()或者submit(),那么另外一个Button怎么办?成百上千个Button又怎么办?

所以,你需要有一套自己实现的算法或者封装,来根据项目页面的特点提供一套通用的元素定位方式。当你的通用定位逻辑能准确的找到任何一个元素的时候,剩下的事情就顺理成章了,交给Selenium WebElement的API就可以了。这一套定位逻辑笔者觉得才是使用Selenium做Web自动化工作量最大的部分。当然有的公司Web项目使用了自己开发的UI框架,例如笔者所在的公司,这样Web元素的定位规则和算法就比较容易设计。如果Web项目开发出来的页面代码比较杂乱无章,那么你就需要更加高明和严谨的逻辑去寻找你想要操作和查看的元素了!

在笔者的项目里,笔者自己设计并封装了一套通用的API,去智能的定位页面中的各种类型的元素。比如项目里的页面有大量的dialog和wizard,都是用div+css实现的。我就提供了一个dialog组件,带有next(),save(),finish(),click(String buttonName),cancel()等方法,然后根据遮罩层和loading Icon的时间来追踪操作完成的进度。这里只是举个小小的例子,有机会再分享更多的细节。

 

 

Selenium工作原理 1.如果希望Selenium 能在本地机器上执行,那么必须在本机上安装相应浏览器WebDriver 2.其中,每一个Driver都是一个Server,它们启动后会监听一个默认的端口并等待测试脚本发送指令请求,并在接收到请求之后会根据指令进行相关的浏览器接口调用 ... 阅读详情

相关推荐

Selenium源码分析之WebDriver

最近比较空闲就仔细看了一下Selenium的源码,因为主要是使用WebDriver所以重点关注了一下WebDriver的工作原理。在前一篇blog里已经解释过了WebDriver与之前Selenium的JS注入实现不同,利用浏览器native support来操作浏览器。所以对于不同平台,不同的浏览器,必须依赖一个特定的浏览器的native component来实现把WebDriver

Ant Ren的专栏 2万+

Selenium原理探秘

本文来自于IBM,本文简单介绍了SeleniumRC的组SeleniumRC的有优缺点,希望对您的学习有帮助。Selenium是ThoughtWorks公司研发的一个强大的基于浏览器的开源自动化测试工具,它通常用来编写web应用的自动化测试。早期也即Selenium1.x时期主要使用SeleniumRC(SeleniumRemoteControl)进来自动化测试。Selenium2.x集SeleniumWebDriver的功能。下图所示为SeleniumRC的工作原理:(1)SeleniumServerSeleniumServer负责控制浏览器行为,总的来说,SeleniumServ

一篇文章带你了解-selenium工作原理详解

Selenium是一个用于Web应用程序自动化测试工具。Selenium测试接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生 .Net、Java、Perl等不同语言的测试脚本(这里主要是针对

qishuzdh的博客 2449

selenium webdriver实现的原理及流程

Selenium实现自动化,主要需要三个东西: 1.自动化测试代码:自动化测试代码发送请求给浏览器的驱动(比如火狐驱动、谷歌驱动) 2.浏览器驱动:它来解析这些自动化测试的代码,解析后把它们发送给浏览器 3.浏览器:执行浏览器驱动发来的指令,并最终完工程师想要的操作。 测试代码中包含了各种期望的对浏览器界面的操作,例如点击。测试代码通过给Webdriver发送指令,让Webdriv...

u013434475的博客 6209

selenium工作原理详解

selenium简介 Selenium是一个用于Web应用程序自动化测试工具。Selenium测试接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。 主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统...

dengying1836的博客 3360

seleniumwebdriver原理

seleniumwebdriver整合后,形的新的测试工具叫做selenium2.x。在selenium1时间,selenium使用javascript来达到测试自动化的目标。 1. selenium RC 早期的Selenium使用的是Javascript注入技术与浏览器打交道,需要Selenium RC启动一个Server,将操作Web元素的API调用化为一段段Javascript,...

weixin_30673715的博客 95

selenium-webdriver(python) (十四) -- webdriver原理

之前看乙醇视频中提到,selenium的ruby实现有一个小后门,在代码中加上$DEBUG=1,再运行脚本的过程中,就可以看到客户端请求的信息与服务器端返回的数据;觉得这个功能很强大,可以帮助理解webdriver的运行原理。 后来查了半天,python并没有提供这样一个方便的后门,不过我们可以通过代理的方式获得这些交互信息; 一、需要安装java虚拟机与selenium-ser...

weixin_30498807的博客 112

Selenium Webdriver原理终于搞清楚了

前言 selenium1.x:这个时候的selenium,使用的是JavaScript注入技术与浏览器打交道。需要Selenium RC启动一个Server,将操作Web元素的API调用化为一段段Javascript,在Selenium内核启动浏览器之后注入这段JavascriptJavascript可以获取并调用DOM的任何元素,自如的进行操作。由此才实现了Selenium的目的:自动化Web操作。 这种Javascript注入技术的缺点是速度不理想,而且稳定性大大依赖于Selenium内核对

专注自动化、性能测试、测试架构学习交流 1万+

Selenium WebDriver的工作原理

先通过一个简单的类比说个好理解的,这个比喻是我从美版知乎Quora上看到的,觉得比较形象、好理解拿来用用。 我们可以把WebDriver驱动浏览器类比出租车司机开出租车。 在开出租车时有三个角色: 乘客:他/她告诉出租车司机去哪里,大概怎么走 出租车司机:他按照乘客的要求来操控出租车 出租车:出租车按照司机的操控完真正的行驶,把乘客送到目的地 在WebDriver中也有类似的三个...

YOYO的博客 3万+

seleniumwebdriver 原理

seleniumwebdriver 原理seleniumwebdriver 通信流程查看 webdriver 源码 seleniumwebdriver 通信流程 主要流程就是 selenium 通过里面的 webdriver 接控制浏览器(通过不同浏览器的驱动)然后对目标进行UI层面的测试。 其本质就是 http 的通信过程: 通过代码服务启动,chromedriver 启动,IP + 端口进行监听 python selenium webdriver 跟 chromedriver

沉觞的博客 2761

【Web自动化】探索SeleniumWebDriver的核心原理

Selenium 是web 应用中基于UI的自动化测试框架,支持多平台、多浏览器、多语言, 可以模拟人工对浏览器进行操作。

保护小周ღ的博客 3487

selenium的工作原理

Selenium是⼀一个⽤用于Web应⽤用程序 ⾃自动化测试⼯工具。Selenium测试 接运⾏行行在浏览器器中,就像真正的⽤用 户在操作⼀一样。Selenium并提供⼀一 套测试函数,⽤用于⽀支持Web⾃自动化 测试,函数⾮非常灵活,能够完界 ⾯面元素定位、窗⼝口跳、结果⽐比较 等。 主要功能: 多浏览器支持 可以对多浏览器器进⾏行行测试,如⽀支持的浏览器器包括IE(7, 8, 9...

IT成长记 4300

【自动化测试】selenium工作原理

selenium工作原理

ReSpace的博客 678

Selenium工作原理详解

前面的代码你看不懂,也没关系,我们再来叙述一下selenium工作的过程1.selenium client(python等语言编写的自动化测试脚本)初始化一个service服务,通过Webdriver启动浏览器驱动程序chromedriver.exe2.通过RemoteWebDriver浏览器驱动程序发送HTTP请求,浏览器驱动程序解析请求,打开浏览器,并获得sessionid,如果再次对浏览器操作需携带此id。

HUACE0047的博客 1446

Selenium 的工作原理

1、一般的脚本测试工作录制脚本,是通过拦截浏览器发送的http请求来实现的,实际上并没有办法录制用户对html页面的操作。 2、Selenium的脚本录制工具是通过监听用户的操作来录制脚本的。Selenium是真正能够监听用户对html页面的操作的录制工作。 3、Selenium执行的内部原理:       ① Selenium服务器通过网络与Selenium客户端通讯,接受Selenium

zzzghj的专栏 2057
上一篇: 解决IE6已终止操作问题
下一篇: ecshop笔记开篇
weixin_33720452
博客等级 码龄11年 3384粉丝 141原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值