关于webdriver

69次阅读

共计 1833 个字符,预计需要花费 5 分钟才能阅读完成。

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),然后返回给客户端脚本,客户端根据返回值就能判断对浏览器 / 手机的操作是否执行成功协议就像是一个抽象类,规定了方法,以及触发方法所需要的数据格式和内容,但是没有具体实现;服务端需要具体去实现这些方法;客户端则需要按照协议规定的数据格式和内容去封装提供给用户的 api
selenium 中的 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()
raise
self._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 即可完成相应的操作

正文完
 0