`

Webdriver基本原理解析之FirefoxDriver

阅读更多

最近仔细看了下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实现原理

    揭秘WebDriver实现原理的实现原理

    selenium WebDriver原理介绍

    关于Selenium WebDriver工作原理的介绍,原理相关描述

    WebDriver FirefoxDriver

    WebDriver 模拟火狐浏览器登录包 selenium-java-2.45.0.jar selenium-java-2.45.0-srcs.jar

    FireFoxDriver-WebDriver

    Selenium-3.3.1版本配套的FrieFox V47和对应的geckodriver V0.15版本32位和64位驱动

    WebDriver FirefoxDriver jar包带源码

    WebDriver 模拟火狐浏览器登录包 selenium-java-2.45.0.jar selenium-java-2.45.0-srcs.jar 带源码包

    selenium webdriver学习.zip

    WebDriver支持Firefox (FirefoxDriver)、IE (InternetExplorerDriver)、Opera (OperaDriver) 和Chrome (ChromeDriver)。对Safari的支持由于技术限制在本版本中未包含,但是可以使用SeleneseCommandExecutor模拟。它...

    Selenium WebDriver的工作原理.docx

    在WebDriver中也有类似的三个角色: 工程师写的自动化测试代码: 自动化测试代码发送请求给浏览器的驱动(比如火狐驱动、谷歌驱动) 浏览器的驱动: 它来解析这些自动化测试的代码,解析后把它们发送给浏览器 ...

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

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

    Selenium WebDriver Practical Guide 最新 原版

    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 ...

    webdriver的chromedriver.exe

    chromeDriver.exe工具是Chrome的WebDriver,可以用于自动化测试,可以操作浏览器,同时selenium操作chrome浏览器需要有ChromeDriver驱动来协助,支持爬虫

    WebDriver基本API使用手册(基于Java和C#).rar

    WebDriver基本API使用手册(基于Java和C#).rar

    webdriver API中文版

    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...

    Selenium2.0之WebDriver学习总结.docx

    这一部分将介绍一下WebDriver的一些具体操作和命令,实际操作中,我们需要两大工具来帮助...接下来我们所讲解的都是以FirefoxDriver为基础的,且基于WebDriver driver = new FirefoxDriver();创建的一个driver实例:

    chrome webdriver chromedriver(谷歌浏览器selenium驱动包118版本!!!)

    它是 WebDriver 协议的实现之一,提供了与 Chrome 浏览器进行交互的接口,使得开发人员可以通过编程方式控制浏览器的行为。 基本介绍: 1、自动化测试:ChromeDriver 常用于自动化测试场景中,开发人员可以使用 ...

    selenium2.44 webdriver

    firefoxDriver和selenium2.44

    web driver 工作原理

    绘制了webdriver 和 浏览器、selenium命令之间是如何进行工作的

    WebDriver实验版.rar

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

    geckodriver, WebDriver <> puppet代理.zip

    geckodriver, WebDriver &lt;&gt; puppet代理 geckodriver使用W3C兼容客户端与基于gecko的浏览器交互的代理。这个程序提供了由协议插件描述的HTTP API,以便与Gecko浏览器( 比如) 通信。 它将调用转换为 Firefox 远程协议...

    Selenium WebDriver实战宝典(吴晓华)

    本书是一本从入门到精通模式的Selenium WebDriver实战经验分享书籍。全书共分为四个部分:第1部分基础篇主要讲解自动化测试相关的基础理论、WebDriver 环境安装、单元测试工具的使用方法以及 WebDrvier的入门使用...

Global site tag (gtag.js) - Google Analytics