最近仔细看了下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
相关推荐
` 或 `FirefoxDriver driver = new FirefoxDriver();` 5. 使用 WebDriver API 进行浏览器操作,如 `driver.get("http://www.example.com");`(打开网页) 6. 执行测试,如查找元素并执行操作,`WebElement element =...
2. **实例化WebDriver**:根据测试目标选择合适的浏览器驱动(如ChromeDriver、FirefoxDriver等),并创建WebDriver对象。 3. **打开浏览器**:调用WebDriver的`get()`方法打开指定URL。 4. **元素操作**:利用`find...
FirefoxDriver driver = new FirefoxDriver(); ``` 5. 执行测试:现在你可以编写测试脚本,通过Selenium WebDriver的方法来控制Firefox浏览器,进行网页的自动化测试。 火狐Driver提供了许多高级功能,如配置...
WebDriver driver = new FirefoxDriver(); driver.get("http://www.example.com"); // 访问指定网站 driver.quit(); // 关闭浏览器 } } ``` 以上示例展示了如何使用WebDriver打开Firefox浏览器访问指定网站,并...
在Python环境下,Selenium提供了一个名为`selenium.webdriver`的模块,其中包含了各种Webdriver的实现,如FirefoxDriver、ChromeDriver等。这些驱动程序允许我们通过Python代码来操作浏览器,如打开网页、点击元素、...
2. **安装与配置**:详细讲解如何在Python环境中安装Selenium库,以及配置相应的WebDriver,如ChromeDriver或FirefoxDriver,确保测试环境的搭建。 3. **基本元素操作**:介绍如何使用Selenium的定位策略,如ID、...
WebDriver driver = new FirefoxDriver(); ``` - **打开Internet Explorer浏览器**: ```java WebDriver driver = new InternetExplorerDriver(); ``` - **打开HtmlUnitDriver(无头浏览器)**: ```java ...
1. **GeckoDriver**: GeckoDriver,也称为FirefoxDriver,是由Mozilla开发的一个开源项目。它的主要作用是作为WebDriver协议的实现,使得自动化测试工具可以与Firefox浏览器进行通信,执行如点击、输入等操作。...
例如,`WebDriver driver = new FirefoxDriver();`将启动一个Firefox浏览器实例。然后,可以通过`driver.get("http://www.example.com");`来导航到指定的网页。Selenium还提供了丰富的API,如`findElement`用于定位...
每个浏览器都有自己的WebDriver实现,比如ChromeDriver对应Chrome浏览器,IEDriver对应Internet Explorer,FirefoxDriver对应Firefox等。 【ChromeDriver的工作原理】 当Selenium WebDriver与ChromeDriver结合使用...
1. **WebDriver API**:了解如何创建WebDriver实例,选择不同的浏览器驱动(如ChromeDriver、FirefoxDriver等),并初始化浏览器。 2. **元素定位**:学习如何使用不同的定位策略找到页面上的特定元素,包括ID、CSS...
Selenium支持多种浏览器驱动,如ChromeDriver或FirefoxDriver,可以控制浏览器执行JavaScript代码,从而获取动态加载的内容。 安装Selenium后,我们首先需要导入相应的模块,并设置浏览器驱动。例如,如果我们选择...