关于webdriver

webdriver协议webdriver协议是一套json格式的规范,本身是基于http协议的这个协议规定了每个操作对应的数据格式,webdriver作为一个服务端,需要实现协议中的每一个操作作为客户端的库文件需要封装好给用户使用的api,每个api对应着协议中不同的数据格式,这些数据封装在http中的body中,数据格式内容和具体的操作一一对应selenium中的webdriver就是浏览器驱动,比如ChromeDriver等,驱动实现了webdriver协议appium中的webdriver是appium server通俗地说:由于客户端脚本(java, python, ruby)不能直接与浏览器/手机通信,这时候可以把webdriver server当做一个翻译器,它可以把客户端代码翻译成浏览器/手机可以识别的代码(比如js),客户端通过http请求向webdriver server发送restful的请求,webdriver server翻译成浏览器/手机懂得脚本传给浏览器/手机,浏览器/手机把执行的结果返回给webdriver server,webdriver server把返回的结果做了一些封装(JSON Wire protocol),然后返回给客户端脚本,客户端根据返回值就能判断对浏览器/手机的操作是否执行成功协议就像是一个抽象类,规定了方法,以及触发方法所需要的数据格式和内容,但是没有具体实现;服务端需要具体去实现这些方法;客户端则需要按照协议规定的数据格式和内容去封装提供给用户的apiselenium中的WebDriver类selenium作为一个客户端,提供给用户的接口基本都在selenium/webdriver/remote/webdriver.py中的WebDriver类中实现这个类是selenium中所有关于浏览器driver类的基类截取Chrome webdriver类中初始化的一段代码:try: RemoteWebDriver.init( self, command_executor=ChromeRemoteConnection( remote_server_addr=self.service.service_url, keep_alive=keep_alive), desired_capabilities=desired_capabilities)except Exception: self.quit() raiseself._is_remote = False可以看到调用了基类的初始化方法,来连接到webdriver server,在此之前会寻找浏览器驱动,并自动启动服务:self.service = Service( executable_path, # 默认为chromedriver port=port, service_args=service_args, log_path=service_log_path)self.service.start() #启动server之后,脚本调用对应的api,就会向这个server发送符合webdriver协议规范的http请求,server接收请求来操作浏览器appium中的WebDriver类appium中的WebDriver继承自很多类,功能更加丰富,当然它也继承了selenium中的webdriver基类class WebDriver( ActionHelpers, Activities, Applications, Clipboard, Context, DeviceTime, HardwareActions, ImagesComparison, IME, Keyboard, Location, Network, RemoteFS, ScreenRecord):在初始化中,command_executor参数填写的是appium server的地址+端口号,这个appium server我们在运行脚本前需要手动启动之后脚本调用对应的api,就会向这个appium server发送符合webdriver协议规范的http请求,appium server接收请求来操作手机总结webdriver中的三个角色测试脚本——作为客户端浏览器驱动/appium server——作为服务端浏览器/手机——作为服务端操作的对象客户端包的作用屏蔽有关协议的内容,让用户不必关心这些细节,只需使用提供给用户的api即可完成相应的操作

January 27, 2019 · 1 min · jiezi

浏览器自动化操作标准--WebDriver

WebDriver是一个浏览器远程控制协议,是一个既定标准,它本身的内容非常丰富,本文不可能全部介绍,本文仅粗略带大家了解一下WebDriver的部分内容以及一个小的实际应用。想深入了解的请参考W3C文档WebDriver.问题背景开发的同学都知道公司为了便于开发和测试都会有多套环境,比如dev开发环境、qa测试联调环境、pre预发模拟线上环境、online线上环境。经常切环境也是一个比较繁琐的事情,简单来说,作为一个前端开发,频率最高的操作路径是:1.通过SwitchHosts切换host2.选择目录和网关(由于环境不够用,但是又需要部署多套代码。为了解决这个问题,我们利用nginx来在一台机器上配置多个目录,每个目录对应不同的代码,当你访问这个页面的时候,网关会记住你所选择的目录,进而对你的请求进行相应的转发)3.登录网页进行ui调试和接口联调SwitchHosts切换host还算方便,但是选择目录、选择网关、打开网页输入用户名密码然后点登录,这个过程操作频率比较高,有点繁琐。能不能自动化这个过程呢?熟悉自动化测试的同学对这个就非常了解了,端到端测试就是利用自动化测试套件模拟用户访问网页的过程。这里我采用selenium-webdriver这个库,通过node来执行自动化脚本,代码如下。那么selenium-webdriver到底是如何与浏览器进行交互的?如何与不同的浏览器进行交互呢?下面就要引入主角了—— WebDriver, WebDriver是W3C的一个标准,它是一个标准,所以不同的浏览器都会有自己的实现,而selenium-webdriver是通过WebDriver协议与浏览器进行交互的。WebDriver是什么WebDriver是W3C的一个标准,是一个远程控制协议,它提供了跨平台和跨语言的方式来远程操控浏览器,它提供了一系列接口来访问和操作DOM,进而控制浏览器的行为。它使得web开发者能写一些自动化脚本来测试网页。WebDriver的工作过程(主要参考:https://blog.csdn.net/ant_ren…)浏览器在启动后会在某一个端口启动基于WebDriver协议的Web Service,接下来我们调用WebDriver的任何api时,都需要借助一个ComandExecutor发送一个命令(也就是给监听端口上的Web Service发送一个http请求),这个命令会告诉浏览器接下来要做什么。WebDriver的实际应用selenium-webdriver这是一个浏览器自动化库,它提供了许多浏览器自动化接口,用于测试web应用。除了通过npm安装selenium-webdriver之外,还需要安装浏览器相应的驱动。它相应的api和用法selenium-webdriver在我们new一个WebDriver的过程中,selenium首先会确认浏览器的native component是否存在可用而且匹配的版本,然后就在目标浏览器里启动一整套Web Service,这套Web Service使用了selenium自己设计定义的协议,名字叫做The WebDriver Wire Protocol。这套协议非常之强大,几乎可以操作浏览器做任何事情,包括打开、关闭、最大化、最小化、元素定位、元素点击、上传文件等等。参考资料https://www.cnblogs.com/linbo…https://cloud.tencent.com/dev...http://www.cnblogs.com/sunada…

January 10, 2019 · 1 min · jiezi