WebDriver 入门

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"], // 这里给出了开始页
      }
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值