最近比较空闲就仔细看了一下Selenium的源码,因为主要是使用WebDriver所以重点关注了一下WebDriver的工作原理。在前一篇blog里已经解释过了WebDriver与之前Selenium的JS注入实现不同,直接利用了浏览器native support来操作浏览器。所以对于不同平台,不同的浏览器,必须依赖一个特定的浏览器的native component来实现把WebDriver API的调用转化为浏览器的native invoke。
在我们new一个WebDriver的过程中,Selenium首先会确认浏览器的native component是否存在可用而且版本匹配。接着就在目标浏览器里启动一整套Web Service,这套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我们希望浏览器接下来做社么事情。
这里笔者初步画了一个图来表示各种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之后,它就能解析出需要执行的操作。截取一段源码如下:
可以看到实际发送的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的代码片段:
相信总结道这里,应该对WebDriver的运行原理应该清楚了!其实挺佩服这一套RESTful web service的设计。感觉封装WebDriver暴露出来的public API还可以更加友好跟强大一点,这次就先总结道这里,会继续分析Selenium源码,继续分享的!
相关推荐
Selenium 是一个强大的开源自动化测试框架,用于网页应用。它支持多种编程语言,如 Java、Python、C#、Ruby 等...通过分析源码,我们可以学习到软件设计模式、网络通信、并发控制等高级编程概念,提升自己的编程技能。
《Selenium WebDriver基于Python源码案例》是一份专为初学者设计的教程,旨在通过实践案例帮助用户快速掌握Selenium WebDriver与Python的结合使用。这个压缩包中的资源,特别是`.epub`格式的电子书,提供了丰富的...
本文将详细介绍如何在C#环境中利用Selenium WebDriver和PhantomJS来抓取此类网页的数据。 首先,PhantomJS是一款无头浏览器,即它没有图形用户界面,但能够像普通浏览器一样加载和执行JavaScript,这对于网页抓取...
3. **Selenium WebDriver**: 也称为 Selenium 2,是目前主要的测试接口,提供了更直接的浏览器控制,支持最新的浏览器技术。 4. **Selenium Grid**: 用于分布式测试,可以同时在多台机器上运行测试,提高测试效率。...
Selenium-WebDriver-Java Selenium-WebDriver-Java的示例
本章就先暂时对总体目录和common/exceptions模块进行大概是分析说,后续逐步对其他模块进行一一说明。
通过分析源码,开发者可以更深入地理解 Selenium 的工作原理,学习如何扩展其功能,或者解决在自动化测试过程中遇到的问题。例如,如果你发现某些浏览器行为没有被正确模拟,可以查看相应的 WebDriver 实现来找出...
1. **理解Selenium WebDriver接口**:了解如何初始化WebDriver对象,设置浏览器配置,并通过它来控制浏览器。 2. **元素定位与交互**:学习使用find_element_by_*系列方法定位页面元素,以及click()、send_keys()等...
7. **源码分析**:ATS-WD 文件可能包含了测试脚本的源码,通过阅读和分析这些脚本,我们可以学习如何编写 WebDriver 测试,如何处理各种异常情况,以及如何组织和执行测试套件。 8. **持续集成(CI)**:在实际项目中...
7. **源码分析**:由于压缩包名为"Selenium-Web-Driver-Extensions-master",这表明它可能包含库的源代码。开发者可以通过查看源代码学习更多关于如何使用Selenium WebDriver进行高级操作,甚至可以根据自己的需求...
在IT行业中,自动化测试是提升效率、确保软件质量的关键手段之一。Python作为一门简洁易读的语言,被广泛用于编写自动化测试脚本。Selenium则是一款强大的网页自动化测试工具,能够模拟用户行为,对Web应用程序进行...
标题中的“test-selenium_java_selenium_源码”表明这是一个关于使用Java编程语言与Selenium自动化测试框架相关的项目。Selenium是一个广泛使用的开源工具,用于Web应用程序的自动化测试,它支持多种编程语言,包括...
3. **性能测试**:虽然Selenium不是专门的性能测试工具,但可以通过并行执行多个测试用例,模拟多用户并发,从而分析系统的性能瓶颈。 4. **持续集成**:Selenium 可以与持续集成工具(如Jenkins、Travis CI)结合...
《Selenium WebDriver for Java 教程源码解析》 Selenium WebDriver是一款强大的自动化测试工具,尤其在Web应用程序的测试领域中被广泛应用。本教程源码是专为Java开发者设计的一份详细指南,旨在帮助初学者深入...
在Eclipse中导入Selenium WebDriver API for Java的项目源码,可以帮助开发人员深入理解其工作原理,便于自定义功能或者进行二次开发。 首先,要导入这个项目到Eclipse,你需要遵循以下步骤: 1. **下载源码**:...
在C#中,我们首先需要安装Selenium WebDriver的相关NuGet包,例如`Selenium.WebDriver`、`Selenium.WebDriver.ChromeDriver`或`Selenium.WebDriver.EdgeDriver`,具体取决于你打算使用的浏览器类型。在本例中,我们...
【标题】"selenium-webdriver-java-testng" 指的是一种使用 Java 语言结合 Selenium WebDriver 和 TestNG 框架进行自动化Web测试的技术。Selenium WebDriver 是一个强大的开源工具,用于模拟用户与网页的交互,而 ...
在Java中,使用Selenium WebDriver需要导入相应的库,并通过创建WebDriver实例来启动浏览器。 其次,Selenium IDE是一个集成在Firefox浏览器中的录播工具,可用于录制和回放测试用例。这对于初学者来说是快速生成...
【Selenium自动化测试平台源码】是一个用于UI测试的开源项目,它采用了代码分层和数据驱动模式的设计理念。在本文中,我们将深入探讨Selenium自动化测试的核心概念、代码分层架构的优势以及数据驱动测试模式的实施...
【标题】"javaweb框架源码-selenium-webdriver-java-tutorials" 提供的是一个用于自动化Web应用程序测试的Java框架,Selenium WebDriver的教程资源。Selenium是一个强大的、开源的Web自动化测试工具,允许开发者使用...