最近仔细看了下Selenium WebDriver的源码, 发现WebDriver的工作原理,理解起来其实还是挺简单的.以下分步介绍:
首先,在理解webdriver的前提是了解webdriver的协议.
关于协议可以参考: https://www.w3.org/TR/webdriver/#go. Firefox官方通过插件的形式实现了这个协议,插件的文件名是webdriver.xpi, 它存放在selenium-firefox-driver.jar的org.openqa.selenium.firefox包下面.
其次, Firefox浏览器被启动后, 同时也加载了webdriver.xpi这个插件,启动了一个实现webdriver协议的http server.
当我们以如下的代码形式启动Firefoxdriver的时候:
WebDriver driver = new FirefoxDriver();
表面上,我们看到的是Firefox浏览器被启动了, 但是本质被打开的浏览器成了一个http server.这个server的默认端口是7055, 此后它开始响应client端(我们的Java代码)的各种对浏览器操作行为的请求. 这个过程的主要逻辑在FirefoxDriver的父类RemoteWebDriver:
public RemoteWebDriver(CommandExecutor executor, Capabilities desiredCapabilities, Capabilities requiredCapabilities) { this.executor = executor; init(desiredCapabilities, requiredCapabilities); if (executor instanceof NeedsLocalLogs) { ((NeedsLocalLogs)executor).setLocalLogs(localLogs); } try { startClient(); //启动浏览器 } catch (RuntimeException e) { try { stopClient(); } catch (Exception ignored) { // Ignore the clean-up exception. We'll propagate the original failure. } throw e; } try { startSession(desiredCapabilities, requiredCapabilities); } catch (RuntimeException e) { try { quit(); } catch (Exception ignored) { // Ignore the clean-up exception. We'll propagate the original failure. } throw e; } }
启动浏览器的逻辑在startClient()方法. RemoteWebDriver.startClient()方法是空的. 它的具体实现在它的子类中. 由于每个浏览器启动的方式显然是会有区别的,所以这个也就很好理解了
最后, 在浏览器和Webdiver的http server被启动之后, 我们就可以使用webdriver实例的api去操作浏览器了.
接下去我们每次对浏览器的一次操作,本质上都是向http server发送一个restful的http请求. 它的核心逻辑在org.openqa.selenium.remote.HttpCommandExecutor.execute(Command)方法中, 所有的用户操作与请求的URL对应关系在org.openqa.selenium.remote.http.JsonHttpCommandCodec.JsonHttpCommandCodec():
public JsonHttpCommandCodec() { defineCommand(STATUS, get("/status")); defineCommand(GET, post("/session/:sessionId/url")); defineCommand(GET_ALL_SESSIONS, get("/sessions")); defineCommand(NEW_SESSION, post("/session")); defineCommand(GET_CAPABILITIES, get("/session/:sessionId")); defineCommand(QUIT, delete("/session/:sessionId")); defineCommand(GET_SESSION_LOGS, post("/logs")); defineCommand(GET_LOG, post("/session/:sessionId/log")); defineCommand(GET_AVAILABLE_LOG_TYPES, get("/session/:sessionId/log/types")); defineCommand(SWITCH_TO_FRAME, post("/session/:sessionId/frame")); defineCommand(SWITCH_TO_PARENT_FRAME, post("/session/:sessionId/frame/parent")); defineCommand(CLOSE, delete("/session/:sessionId/window")); }
比如说, 我们要执行driver.get("http://www.baidu.com")这行代码的时候, 对应的http请求是上面定义的defineCommand(GET, post("/session/:sessionId/url")), sessionId是用来被具体ID替换的.
实际上程序中HttpRequest得到的URL是: /session/930ce0fc-bcde-48bd-8f25-0bd2b2af716d/url
HttpRequest的content内容是: http://www.baidu.com
最终它们通过httpClient调用来执行:
HttpResponse httpResponse = client.execute(httpRequest, true);
以上就是FirefoxDriver的基本运行原理
转载请注明出处: http://lijingshou.iteye.com/blog/2304334
相关推荐
揭秘WebDriver实现原理的实现原理
关于Selenium WebDriver工作原理的介绍,原理相关描述
WebDriver 模拟火狐浏览器登录包 selenium-java-2.45.0.jar selenium-java-2.45.0-srcs.jar
Selenium-3.3.1版本配套的FrieFox V47和对应的geckodriver V0.15版本32位和64位驱动
WebDriver 模拟火狐浏览器登录包 selenium-java-2.45.0.jar selenium-java-2.45.0-srcs.jar 带源码包
WebDriver支持Firefox (FirefoxDriver)、IE (InternetExplorerDriver)、Opera (OperaDriver) 和Chrome (ChromeDriver)。对Safari的支持由于技术限制在本版本中未包含,但是可以使用SeleneseCommandExecutor模拟。它...
在WebDriver中也有类似的三个角色: 工程师写的自动化测试代码: 自动化测试代码发送请求给浏览器的驱动(比如火狐驱动、谷歌驱动) 浏览器的驱动: 它来解析这些自动化测试的代码,解析后把它们发送给浏览器 ...
WebDriver实验版VB6版WebDriver实验,压缩包中有技术文档《WebDriver原理及实验》
Acquire an understanding of the various WebDriver implementations such as Firefox Driver, IE Driver, and Chrome Driver Explore WebDriver EventListeners Design effective automation frameworks using ...
chromeDriver.exe工具是Chrome的WebDriver,可以用于自动化测试,可以操作浏览器,同时selenium操作chrome浏览器需要有ChromeDriver驱动来协助,支持爬虫
WebDriver基本API使用手册(基于Java和C#).rar
webdriver API中文版 webdriver API中文版 2 1.1 下载selenium2.0的lib包 2 1.2 用webdriver打开一个浏览器 2 1.3 打开测试页面 3 1.4 GettingStarted 3 第2章 Webdirver对浏览器的支持 5 2.1 HtmlUnit Driver...
这一部分将介绍一下WebDriver的一些具体操作和命令,实际操作中,我们需要两大工具来帮助...接下来我们所讲解的都是以FirefoxDriver为基础的,且基于WebDriver driver = new FirefoxDriver();创建的一个driver实例:
它是 WebDriver 协议的实现之一,提供了与 Chrome 浏览器进行交互的接口,使得开发人员可以通过编程方式控制浏览器的行为。 基本介绍: 1、自动化测试:ChromeDriver 常用于自动化测试场景中,开发人员可以使用 ...
firefoxDriver和selenium2.44
绘制了webdriver 和 浏览器、selenium命令之间是如何进行工作的
VB6版WebDriver实验,压缩包中有技术文档《WebDriver原理及实验》《WebDriver命令编程手册(英文版、中文机翻版)》,代码演示的功能有:操作浏览器自动打开百度、搜索mp3,获得网页源码,获得网页标题,网页截图,...
geckodriver, WebDriver <> puppet代理 geckodriver使用W3C兼容客户端与基于gecko的浏览器交互的代理。这个程序提供了由协议插件描述的HTTP API,以便与Gecko浏览器( 比如) 通信。 它将调用转换为 Firefox 远程协议...
本书是一本从入门到精通模式的Selenium WebDriver实战经验分享书籍。全书共分为四个部分:第1部分基础篇主要讲解自动化测试相关的基础理论、WebDriver 环境安装、单元测试工具的使用方法以及 WebDrvier的入门使用...