参考:https://www.jianshu.com/p/81ce4bf0d0c0
Selenium 官网
Selenium WebDriver官网
webdriver实用指南python版本
WebDriver原理1
在我们创建一个WebDrive实例的过程中,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我们希望浏览器接下来做社么事情。
使用Selenium实现驱动浏览器,主要涉及三个东西。
测试代码
测试代码就是程序员利用不同的语言和相应的selenium API库完成的代码。本文将以python为例进行说明。
Webdriver
Webdriver是针对不同的浏览器开发的,不同的浏览器有不同的webdriver。例如针对Chrome使用的chromedriver。
浏览器
浏览器和相应的Webdriver对应。
————————————————
版权声明:本文为CSDN博主「慕城南风」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lovedingd/article/details/110929187
WebDriver原理1
WebDriver是按照Server-Client 的模式设计的。
Server就是 Remote Server,可以是任意的浏览器。当我们的脚本启动浏览器后,该浏览器就是Remote Server,她的职责就是等待 Client 发送请求并做出响应。
Client 端简单说就是我们写的测试脚本。脚本中的一些行为比如打开浏览器,跳转到指定的 URL 等操作就是以 http 请求的方式发送给被测试的浏览器,也就是Remote Server。Remote Server接受请求,执行相应操作,并在 Response中返回执行状态、返回值等信息。
Introducing WebDriverI
WebDriver 可以看作是Selenium-RC替代品。所以现在学习 Selenium 就不需要花时间专注于Selenium-RC了。
Selenium 2.0的主要新特性是WebDriver API的集成。WebDriver旨在提供一个更简单、更简洁的编程接口,以解决Selenium-RC API的一些限制。Selenium-WebDriver是为了更好地支持动态web页面而开发的,页面的元素在没有页面本身被重新加载的情况下可能会发生变化。WebDriver的目标是提供一个设计良好的面向对象的API,为现代高级web应用程序测试问题提供改进的支持。
Selenium RC(Selenium 3.0版本移除了该模块,以后还是使用 WebDriver 进行脚本的编写) 由Clent Libraies 和 Selenium Server组成:
Selenium Libraies 用于编写测试脚本,支持多种不同的主流开发语言,用来控制Selenium Server.
Selenium Server 则负责控制浏览器的行为,而Selenium Server 又由三部分组成:
-
Selenium Core:被Selenium Server 嵌入到浏览器页面中,是一堆的JavaScript 函数的集合,通过这些JavaScript函数来实现对浏览器的操作。
-
Launcher:用于启动浏览器,把Selenium Core加载到浏览器页面当中,并把浏览器的代理设置Selenium Server 的Http Proxy。
-
Http Proxy:Selenium Server的http代理。
How Does WebDriver ‘Drive’ the Browser Compared to Selenium-RC?
Selenium-WebDriver使用每个浏览器对自动化的本地支持直接调用浏览器。这些直接调用是如何生成的,它们支持的特性取决于您使用的浏览器。本章稍后将提供关于每个“浏览器驱动程序”的信息。
对于那些熟悉Selenium-RC的人来说,这与您所习惯的完全不同。Selenium-RC对每个支持的浏览器都使用相同的方法。它在浏览器加载时将javascript函数注入浏览器,然后使用javascript在浏览器中驱动AUT。WebDriver不使用这种技术。同样,它直接驱动浏览器使用内置的支持自动化的浏览器。
WebDriver and the Selenium-Server
您可能,也可能不需要Selenium服务器,这取决于您打算如何使用Selenium- webdriver。如果您的浏览器和测试都运行在同一台机器上,并且您的测试只使用WebDriver API,那么您就不需要运行selenium服务器;WebDriver将直接运行浏览器。
不过,有一些原因可以使用selenium服务器和Selenium-WebDriver。
- 您正在使用Selenium-Grid在多台机器或虚拟机(vm)上分发测试。
- 您希望连接到具有特定浏览器版本的远程机器,而不是当前机器上的。
- 您没有使用Java绑定(例如Python、c#或Ruby),并希望使用 HtmlUnit Driver。
Introducing the Selenium-WebDriver API by Example
WebDriver是一种用于自动化web应用程序测试的工具,特别是用于验证它们是否按预期工作。它的目标是提供一个友好的API,易于探索和理解,比Selenium-RC (1.0) API更容易使用,这将有助于使您的测试更容易阅读和维护。它不依赖于任何特定的测试框架,因此它可以在单元测试项目中或从简单的旧的“main”方法中使用。本节介绍WebDriver的API,并帮助您熟悉它。如果您还没有建立一个WebDriver项目,那就开始吧。这在前面的小节中描述过,设置了一个Selenium-WebDriver项目。
一旦您的项目建立起来,您可以看到WebDriver就像任何普通的库一样:它是完全自包含的,而且您通常不需要记住在使用它之前启动任何其他进程或运行任何安装程序,而不是使用Selenium-RC的代理服务器。
我们写的自动化程序 需要使用 客户端库。
我们程序的自动化请求都是通过这个库里面的编程接口发送给浏览器。
比如,我们要模拟用户点击界面按钮, 自动化程序里面就应该 调用客户端库相应的函数, 就会发送 点击元素 的请求给 下方的 浏览器驱动。 然后,浏览器驱动再转发这个请求给浏览器。
这个自动化程序发送给浏览器驱动的请求 是HTTP请求。
客户端库从哪里来的? 是Selenium组织提供的。
Selenium组织提供了多种 编程语言的Selenium客户端库, 包括 java,python,js, ruby等,方便不同编程语言的开发者使用。
我们只需要安装好客户端库,调用这些库,就可以发出自动化请求给浏览器咯
浏览器驱动 也是一个独立的程序,是由浏览器厂商提供的, 不同的浏览器需要不同的浏览器驱动。 比如 Chrome浏览器和 火狐浏览器有 各自不同的驱动程序。
浏览器驱动接收到我们的自动化程序发送的界面操作请求后,会转发请求给浏览器, 让浏览器去执行对应的自动化操作。
浏览器执行完操作后,会将自动化的结果返回给浏览器驱动, 浏览器驱动再通过HTTP响应的消息返回给我们的自动化程序的客户端库。
自动化程序的客户端库 接收到响应后,将结果转化为 数据对象
返回给 我们的代码。
我们的程序就可以知道这次自动化操作的结果如何了。
我们再总结一下,selenium 自动化流程如下:
- 自动化程序调用Selenium 客户端库函数(比如点击按钮元素)
- 客户端库会发送Selenium 命令 给浏览器的驱动程序
- 浏览器驱动程序接收到命令后 ,驱动浏览器去执行命令
- 浏览器执行命令
- 浏览器驱动程序获取命令执行的结果,返回给我们自动化程序
- 自动化程序对返回结果进行处理