WebDriver 入门
简介
WebDriver是一个可以对用户代理进行自省和控制的远程控制接口。 它提供了一种与平台和语言无关的协议,作为进程外程序远程指示Web浏览器行为的一种方式。
提供这组接口的主要目的是为网络开发人员提供一个自动化的测试接口。
该祖接口遵循 兼容,简单,易扩展等特点设计。
术语
在表达式中,所有的数字都是整数,用 + 代表加号, - 代表减号, / 代表除号, 另外 | 代表或, 可以使用"("")"来该表逻辑运算顺序。
在数学函数中, min 用来获取最小值, max 来获取最大值, floor 来获取小于该值的最大整数。
在项目中广泛用到 通用唯一标示(Universally Unique IDentifier - UUID), 该值有128位长。
UUID并不是由主程序统一分配的,而是通过随机数算法生成的,然后转换为字符串的形式得到的。
Unix Epoch 是指 1970年1月1日到现在的秒数。
ECMAScript属性的初始值是平台为该属性定义的值,即在内容脚本没有任何阴影的情况下它将具有的值。
browser chrome 部分并不是规范部分,这部分包含菜单,工具栏,其他组件等。
接口
如果要接收远程控制,需要打开 webdriver-active flag ,设置为 true, 初始值是 false。
Navigator includes NavigatorAutomationInformation;
需要注意 应该避免 NavigatorAutomationInformation 在 WorkerNavigator 暴露。
interface mixin NavigatorAutomationInformation {
readonly attribute boolean webdriver;
};
如果 webdriver-active flag 设置成功,就返回 true, 否则为 false。
对 web 开发者 (非规范):
navigator.webdriver
定义了一种标准方法,用于与用户代理进行协作,以告知文档该文档由WebDriver控制,例如,以便在自动化期间可以触发备用代码路径。
节点
WebDriver协议包括:
-
本地端:
本地端代表协议的客户端,通常以特定语言的库的形式提供在WebDriver协议之上的API。 该规范对有线协议级别以上的那些库的细节没有任何限制。 -
远端:
远端托管协议的服务器端。 定义响应WebDriver协议的远端行为是本规范的最大部分。 -
中间节点
中间节点是充当代理的节点,可同时实现协议的本地端和远程端。 但是,不希望它们直接实现远程结束步骤。 特定中介节点和本地端之间的所有节点都称为该节点的下游。 相反,特定中介节点和端点节点之间的任何节点都称为上游。 -
端点节点
终结点节点是不是中间节点的节点链中的最终远程端。 端点节点由用户代理或类似程序实现。
从本地端的角度来看,所有远程端节点类型都必须与远程端不可区分,因此在有线协议方面受远程端要求的约束。
远端的就绪状态指示它是否可以自由接受新连接。 如果最大活动会话数等于活动会话列表的长度,或者该节点是中间节点并且已知处于尝试创建新会话的失败状态,则必须为false。 在所有其他情况下,它必须为真。
协议
WebDriver远程端必须提供HTTP兼容的有线协议,其中端点映射到不同的命令。
由于该标准仅定义了远端协议,因此它对如何实现本地端没有任何要求。 只能预期本地端在能够说出远程端协议的范围内兼容; 对于其公开的面向用户的API并没有要求。
### 算法协议
本规范的各个部分均按照分步算法编写。 这些算法的细节没有任何规范意义。 实现可以自由采用任何产生与规范等效输出的实现策略。 特别是,本文档中的算法针对可读性而非性能进行了优化。
这个协议设计使用了中间变量等技术达到兼容错误的目的。
命令格式如下:
获取值: Object.[[GetOwnProperty]](name).
设置值: Object.[[Put]](name, value).
序列化: JSON.[[Stringify]](object)
逆序列号: JSON.[[Parse]](text)
终端的方法的表格:
方法 | URI 模板 | 说明 |
---|---|---|
POST | /session | 新建 session |
DELETE | /session/{session id} | 删除 session |
GET | /status | 查看状态 |
GET | /session/{session id}/timeouts | 获取超时时间长度 |
POST | /session/{session id}/timeouts | 设置超时时间长度 |
POST | /session/{session id}/url | 设置url地址 |
GET | /session/{session id}/url | 获取url地址 |
POST | /session/{session id}/back | 返回 |
POST | /session/{session id}/forward | 向前 |
POST | /session/{session id}/refresh | 刷新 |
GET | /session/{session id}/title | 获取题目 |
GET | /session/{session id}/window | 获取窗口句柄 |
DELETE | /session/{session id}/window | 关闭窗口 |
POST | /session/{session id}/window | 切换窗口 |
GET | /session/{session id}/window/handles | 获取窗口句柄 |
POST | /session/{session id}/window/new | 新建窗口 |
POST | /session/{session id}/frame | 切换帧 |
POST | /session/{session id}/frame/parent | 切换到父帧 |
GET | /session/{session id}/window/rect | 获取窗口矩形 |
POST | /session/{session id}/window/rect | 设置窗口矩形 |
POST | /session/{session id}/window/maximize | 最大化 |
POST | /session/{session id}/window/minimize | 最小化 |
POST | /session/{session id}/window/fullscreen | 全屏 |
GET | /session/{session id}/element/active | 获取活动元素 |
POST | /session/{session id}/element | 寻找元素 |
POST | /session/{session id}/elements | 寻找多个元素 |
POST | /session/{session id}/element/{element id}/element | 从元素中查找元素 |
POST | /session/{session id}/element/{element id}/elements | 从元素中查找多个元素 |
GET | /session/{session id}/element/{element id}/selected | 是否选择了元素 |
GET | /session/{session id}/element/{element id}/attribute/{name} | 获取元素属性 |
GET | /session/{session id}/element/{element id}/property/{name} | 获取元素属性 |
GET | /session/{session id}/element/{element id}/css/{property name} | 获取元素的CSS值 |
GET | /session/{session id}/element/{element id}/text | 获取元素的文本 |
GET | /session/{session id}/element/{element id}/name | 获取元素的标签名 |
GET | /session/{session id}/element/{element id}/rect | 获取元素的矩形 |
GET | /session/{session id}/element/{element id}/enabled | 是否启用元素 |
POST | /session/{session id}/element/{element id}/click | 元素点击 |
POST | /session/{session id}/element/{element id}/clear | 元素清除 |
POST | /session/{session id}/element/{element id}/value | 发送按键 |
GET | /session/{session id}/source | 获取页面代码 |
POST | /session/{session id}/execute/sync | 执行脚本 |
POST | /session/{session id}/execute/async | 执行异步脚步 |
GET | /session/{session id}/cookie | 获取所有的 cookies |
GET | /session/{session id}/cookie/{name} | 获取指定 cookie |
POST | /session/{session id}/cookie | 添加 cookie |
DELETE | /session/{session id}/cookie/{name} | 删除指定 cookie |
DELETE | /session/{session id}/cookie | 删除所有 cookie |
POST | /session/{session id}/actions | 执行动作 |
DELETE | /session/{session id}/actions | 释放动作 |
POST | /session/{session id}/alert/dismiss | 解除提醒 |
POST | /session/{session id}/alert/accept | 接受警报 |
GET | /session/{session id}/alert/text | 获取警报文本 |
POST | /session/{session id}/alert/text | 发送报警文本 |
GET | /session/{session id}/screenshot | 屏幕截图 |
GET | /session/{session id}/element/{element id}/screenshot | 元素截图 |
扩展命令
这部分是用户自定义的扩展命令,
就是其他的一些可能带有 session id 的链接命令,如官方举的一个例子:
/session/5d376174-36f0-11e5-9b9a-6bdf200a3f7f/ms/edge/context
session/{session id} 就是指明 session id
ms/edge 指明值微软的 edge 浏览器, 这样就可以兼容多种浏览器
context 描述命令的执行函数
有的时候也用一些扩展配置来辅助扩展命令满足命令执行的多样性。
官方给的一个下面的新建 session 的例子。
{
"capabilities": {
"alwaysMatch": {
// browser specific configuration
"<prefix>:browserOptions": {
"binary": "/usr/bin/browser-binary",
"args": ["--start-page=https://example.com"], // 这里给出了开始页
}
}
}
}