前世 Selenium RC
早期的 Selenium 使用的是 JavaScript 注入技术与浏览器打交道,需要 Selenium RC 启动一个 Server,将操作 web 元素的 API 调用转化为一段段 Javascript,在 Selenium 内核启动浏览器之后注入这段 Javascript.开发过 Web 应用的人都知道,Javascript 可以获取并调用页面的任何元素,自如的进行操作.由此才实现了 Selenium 的目的:自动化 Web 操作.这种 Javascript 注入技术的缺点是速度不理想,而且稳定性大大依赖于 Selenium 内核对 API 翻译成的 Javascript 质量高低.
今生 WebDriver
当 Selenium2.x 提出了 WebDriver 的概念之后,它提供了完全另外的一种方式与浏览器交互是.利用浏览器原生的 API,封装成一套更加面向对象的 Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类).由于使用的是浏览器原生的 API,速度大大提高,而且调用的稳定性交给了浏览器厂商本身,显然是更加科学.然而带来的一些副作用就是,不同的浏览器厂商,对 Web 元素的操作和呈现多少会有一些差异,这就直接导致了 Selenium WebDriver 要分浏览器厂商不同,而提供不同的实现.例如 Firefox 就有专门的 FirefoxDriver,Chrome 就有专门的 ChromeDriver 等等.(甚至包括了 AndroidDriver 和 iOS WebDriver)
Selenium3.0 发布后,最大更新点就是干掉了对 selenium rc 的支持,这标志着 webdriver 协议最终一统江湖,rc 毕竟是继子,webdriver 才是亲儿子,假儿子给真儿子让路,豪门继承权尘埃落定.
selenium3.0 的意味着什么
webdriver 协议现在已经成为业内公认的浏览器 UI 测试的标准实现.简而言之,做浏览器 ui 测试,请认准 selenium webdriver 商标.各种官方支持意味着以后的浏览器 UI 测试的速度和稳定性会有较大的提升.selenium 2.0 时代只有 chrome driver 是官方出品,其它实现均是第三方.从稳定性上说,2.0 时代最稳定的测试浏览器是 chrome 和 firefox,其它浏览器支持均或多或少有些问题.浏览器 UI 自动化测试已经成为了行业标配.这也是为什么几乎所有浏览器厂商都推出自己官方 driver 的原因.
RemoteWebDriver(selenium 的 WebDriver 的基类)
启动目标浏览器,并绑定到指定端口.该启动的浏览器实例,做为 web driver 的 remote server,Remote server 需要依赖原生的浏览器组件(如:IEDriver.dll,chromedriver.exe),来转化浏览器的 api 调用,一些定位元素的 api 都在该类中.
WebDriver
webdriver 是按照 server - client 的经典设计模式设计的.
webdriver 的作用就是创建一个新的浏览器实例,也就是启动一个 Server 端.
(Starts the service and then creates new instance of chrome driver)
server 端就是我们的 Remote server,也就是我们通过各个不同浏览器所启动的浏览器实例,在我们脚本启动浏览器后,这个浏览器就可以称之为我们的 Remote server,它的职责就是等待 client 发送请求并做出相应处理.
client 就是我们的测试代码,我们测试代码中的所有操作,比如打开浏览器,寻找元素,点击都是以 http 请求的方式发送给被测试浏览器,也就是我们的 Remote server,remote server 接受请求,并执行相应操作,并在 response 中返回执行状态,返回值等信息 (这里调用的接口是浏览器的源生 API,而每一个浏览器都有自己的一套接口信息,这也就是为什么我们要安装不同的驱动的原因)
WebDriver 工作流程
1,通过 WebDriver 创建一个浏览器服务,remote server.
2,脚本启动时会在新的线程中启动一个浏览器,并绑定特定的端口,没个浏览器有不同的端口段.
3,client 创建 1 个 session,在该 session 中通过 http 请求向 remote server 发送 restful 的请求,remote server 解析请求,完成相应操作并返回 response.
4,分析 response,继续执行脚本还是结束执行
command.py
Command 类中定义了 WebDriver 的一些常用的常量.
remote\webdrvier.py
所有浏览器 webdrvier 的基类,其中包含了所有 webdriver 的 api 接口
remote\remote_connection.py
包含启动 Remote WebDrvier server,执行 client 请求,self._commands 是 selenium 的核心请求参数,根据对应的 Command 常量,发送不同的 http 请求.
Page Object Model(POM)的优势
1. POM 提供了一种在 UI 层操作,业务流程与验证分离的模式,这使得测试代码变得更加清晰和高可读性
2. 对象库与用例分离,使得我们更好的复用对象,甚至能与不同的工具进行深度结合应用
3. 可复用的页面方法代码会变得更加优化
4. 更加有效的命名方式使得我们更加清晰的知道方法所操作的 UI 元素.例如我们要回到首页,方法名命名为: gotoHomePage(), 通过方法名即可清晰的知道具体的功能实现.
来源: http://www.bubuko.com/infodetail-2471532.html