`

揭秘WebDriver的实现原理(转)

阅读更多

通过研究selenium-webdriver的源码,笔者发现其实webdriver的实现原理并不高深莫测无法揣度。在这里以webdriver ruby bindingfirefox-webdriver实现为例,简单介绍一下webdriver的工作原理。

  • 当测试脚本启动firefox的时候,selenium-webdriver 会首先在新线程中启动firefox浏览器。如果测试脚本指定了firefox的profile,那么就以该profile启动,否则的话就新启1个profile,并启动firefox;

  • firefox一般是以-no-remote的方法启动,启动后selenium-webdriver会将firefox绑定到特定的端口,绑定完成后该firefox实例便作为webdriver的remote server存在;

  • 客户端(也就是测试脚本)创建1个session,在该session中通过http请求向remote server发送restful的请求,remote server解析请求,完成相应操作并返回response;

  • 客户端接受response,并分析其返回值以决定是转到第3步还是结束脚本;

这就是webdriver的工作流程,看起来很复杂实际上当了解了webdriver的实现原理后,理解上述问题应该比较简单。

webdriver是按照server – client的经典设计模式设计的。

server端就是remote server,可以是任意的浏览器。当我们的脚本启动浏览器后,该浏览器就是remote server,它的职责就是等待client发送请求并做出相应;

client端简单说来就是我们的测试代码,我们测试代码中的一些行为,比如打开浏览器,转跳到特定的url等操作是以http请求的方式发送给被测试浏览器,也就是remote server;remote server接受请求,并执行相应操作,并在response中返回执行状态、返回值等信息;

举个实际的例子,下面代码的作用是”命令”firefox转跳到google主页:

driver = Selenium::WebDriver.for :firefox

driver.navigate.to "http://google.com"

在执行driver.navigate.to “http://google.com” 这句代码时,client,也就是我们的测试代码向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的操作。

如果上述请求是可接受的,或者说remote server是实现了这个接口,那么remote server会跳转到该post data包含的url,并返回如下的response

{"name":"get","sessionId":"285b12e4-2b8a-4fe6-90e1-c35cba245956","status":0,"value":""}

该response中包含如下信息

  • name:remote server端的实现的方法的名称,这里是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端进行交互。

那么remote server端的这些功能是如何实现的呢?答案是浏览器实现了webdriver的统一接口,这样client就可以通过统一的restful的接口去进行浏览器的自动化操作。目前webdriver支持ie, chrome, firefox, opera等主流浏览器,其主要原因是这些浏览器实现了webdriver约定的各种接口。

具体见http://code.google.com/p/selenium/wiki/JsonWireProtocol#Command_Reference。

由于笔者能力有限才疏学浅,因此文中定然有些谬误之处,还望不吝指出,多多斧正之。

分享到:
评论
1 楼 913486037 2013-07-13  
谢谢,楼主真棒!

相关推荐

    揭秘WebDriver实现原理

    ### 揭秘WebDriver实现原理 #### 一、WebDriver概述 WebDriver是Selenium项目中的一个组件,用于自动化Web应用测试。它直接与浏览器交互,能够模拟真实用户的操作行为,因此广泛应用于自动化测试领域。 #### 二、...

    selenium WebDriver原理介绍

    总的来说,Selenium WebDriver 的工作原理是通过标准化的协议和驱动程序,实现了测试代码对浏览器的直接控制,提供了丰富的功能和强大的兼容性,使得Web应用的自动化测试变得简单而高效。掌握这些原理,可以帮助我们...

    Selenium WebDriver的工作原理.docx

    总的来说,Selenium WebDriver通过WebDriver API、浏览器驱动和浏览器的协同工作,实现了跨平台、跨浏览器的自动化测试。其采用HTTP和JSON Wire Protocol确保了不同编程语言的兼容性,使得编写和执行自动化测试变得...

    使用webdriver实现主页面跳转到子页面后又回到主页面的操作

    使用webdriver实现主页面跳转到子页面后又回到主页面的操作 本资源旨在讲解如何使用webdriver实现主页面跳转到子页面后又回到主页面的操作。webdriver是一个基于浏览器的自动化测试工具,能够模拟用户的行为,自动...

    WebDriver实验版VB6版WebDriver实验,压缩包中有技术文档《WebDriver原理及实验》

    在压缩包"WebDriver实验版.rar"中,我们期待找到的技术文档《WebDriver原理及实验》很可能会涵盖以下几个关键知识点: 1. **WebDriver的基本概念**:WebDriver作为一个开放源代码的API,它的主要目标是提供一种更...

    webdriver实现浏览器窗口的最大化.docx

    上述代码提供了一个使用 Selenium WebDriver 实现浏览器窗口最大化的实例,具体步骤如下: 1. 首先,通过 `System.setProperty` 设置 ChromeDriver 的路径,这是因为 WebDriver 需要知道对应浏览器的驱动程序位置...

    qtwebdriver:Qt的WebDriver实现

    QtWebDriver是Qt的WebDriver实现。 它可用于基于以下条件对应用程序执行自动Selenium测试: QtWebkit Q小部件 QQuick1(Qt4)或QQuick2(Qt5) 如果您没有使用Selenium进行自动化测试,那么您可能还会发现此链接...

    使用webdriver实现主页面跳转到子页面后又回到主页面的操作.pdf

    使用webdriver实现主页面跳转到子页面后又回到主页面的操作 在本文中,我们将使用webdriver与Selenium 1.0实现主页面跳转到子页面后又回到主页面的操作。这个操作案例将展示如何使用webdriver来自动化浏览器的操作...

    WebDriver所需包

    2. **WebDriver实现**:每个浏览器都有其对应的WebDriver实现,如ChromeDriver用于Chrome浏览器,GeckoDriver用于Firefox。这些实现是WebDriver与特定浏览器通信的桥梁。它们是可执行文件,需要下载并配置到系统路径...

    WebDriver

    对于标签 "源码",我们可以理解为 WebDriver 的实现是开放源代码的,这使得社区可以对其进行定制和扩展,以满足特定需求。开发者可以通过阅读源码来理解其工作原理,甚至贡献自己的代码来修复问题或添加新功能。 ...

    16_基于Selenium与Webdriver实现爬虫.zip

    本项目实战“基于Selenium与WebDriver实现爬虫”将教你如何利用这两款工具来应对动态加载和JavaScript渲染的网页抓取挑战。 Selenium是一个用于Web应用程序测试的开源工具,它支持多种浏览器,并可以模拟用户的真实...

    WebDriver命令参考手册

    该协议假设 WebDriver API 已经被“flatten”,但客户端实现将采用更面向对象的方法,如当前的 Java API 所示。 基本概念和术语 在 WebDriver 中,有一些基本概念和术语需要了解: 客户端(Client):使用 ...

    webdriver安装包

    源代码可以帮助开发者更好地调试问题,学习如何与 WebDriver API 交互,或者创建自定义的 WebDriver 实现。 4. **libs**:这个文件夹可能包含了 Selenium Server 运行所需的库文件。这些库文件是其他 Java 类库,...

    WebDriver实验版.rar

    VB6版WebDriver实验,压缩包中有技术文档《WebDriver原理及实验》《WebDriver命令编程手册(英文版、中文机翻版)》,代码演示的功能有:操作浏览器自动打开百度、搜索mp3,获得网页源码,获得网页标题,网页截图,...

    webdriver API中文版

    1. **使用 Remote WebDriver**:允许在远程服务器上运行测试,通过 `RemoteWebDriver` 类实现。 2. **Selenium Server**:作为客户端和远程浏览器之间的中间件,处理请求并分发到相应的浏览器实例。 3. **设置 Fire...

    webdriver模拟火狐firefox浏览器

    9. Wait和Expected Conditions:在处理动态加载的网页时,我们经常需要等待某个条件满足再继续执行,WebDriver提供了`WebDriverWait`和预期条件(Expected Conditions)类来帮助我们实现这一点。 10. 兼容性和更新...

    IE Webdriver (Python)

    **IE WebDriver for Python** ...了解这些基本概念和技巧后,你就能在 Python 中使用 IE WebDriver 实现自动化测试和网页交互了。记得在实际操作中,根据项目需求和环境调整相应的设置,以确保测试的有效性和稳定性。

    php-webdriver-bindings.rar_php-webdriver

    PHP Webdriver Bindings 实现了这个标准,让 PHP 开发者也能充分利用 Webdriver 的功能。 **主要特性:** 1. **易用性**:PHP Webdriver Bindings 提供了简单易懂的 PHP 接口,使得编写测试脚本变得直观。开发者...

    python +selenium webdriver 学习借鉴

    在本文档中,我们将学习如何使用 Python 和 Selenium WebDriver 实现自动化测试。 元素定位 元素定位是 Selenium WebDriver 的核心功能之一,用于定位 WEB 元素。元素定位可以通过多种方式实现,包括使用浏览器...

Global site tag (gtag.js) - Google Analytics