超级浏览器Webdriver自动化开发
一、概述
通过Webdriver实现对超级浏览器内的店铺进行,自动化控制以及数据抓取,主要流程分为以下两个部分
(一)与超级浏览器主进程通信。
这个部分是通过Socket实现与超级浏览器主进实现通讯的,主要工作是获取店铺列表以及准备店铺环境,一个店铺相当于一个独立浏览器。
(二)通过Selenium API 启动和控制超级浏览器内核
这个部分主要是由自动化程序开发者自行开发,需要自行了解Selenium API如何使用。启动Selenium时有些参数依赖与超级浏览器主进程通讯的结果
二、交互时序图
三、必要条件以及注意事项
(一)启动超级浏览器主进程必要配置启动参数
1、--run_type=web_driver
指定以Webdriver 模式运行主进程,本质是让超级浏览器以无界面状态运行。超级浏览器进程会自动保证进程唯一,所以多次启动会自动放弃后启动进程。但是手动点击启动的超级浏览器会Kill掉Webdriver 模式运行的进程
2、--socket_port=端口号
告诉超级浏览器双方socket通讯端口是什么,超级浏览器会以该端口在127.0.0.1启动一个socket服务端
(二)Socket通讯注意事项
1、每条Socket请求和响应数据必须以"\r\n"结尾
2、Socket请求内容和返回结果都是通过JSON结构组织,收发消息统一以UTF-8编码
3、Socket请求的相应都是异步返回的,可以并发执行,通过在请求参数里面添加一个全局唯一的requestId字段来标识请求,该字段会在响应内返回
(三)其他注意事项
1、getBrowserEnvInfo返回数据不能复用,每次都要重新调用。
2、需要根据运行设备的配置,适当控制同时启动的店铺浏览器窗口总个数,店铺刚刚启动时非常消耗CPU可以考虑错开启动。这个部分需要开发者自行调优,没有明确的标准。
四、Socket接口说明
(一)Action : getBrowserList
1、说明:获取店铺列表
2、请求参数:
{
"userInfo": "{\"company\":\"公司\",\"username\":\"用户名\",\"password\":\"密码\"}",
"action": "getBrowserList",
"requestId": "全局唯一标识"
}
3、响应结果:
{
"statusCode": "状态码",
"err": "异常信息",
"action": "getBrowserList",
"requestId": "全局唯一标识",
"browserList": [{
"browserOauth": "店铺ID",
"browserName": "店铺名称",
"browserIp": "店铺IP",
"siteId": "店铺所属站点",
"isExpired": false //ip是否过期
}]
}
4、状态码:
(1)0 : 成功
(2)-10000 : 未知异常
(3)-10002 : Socket参数非法
(4)-10003 : 登录失败
(5)-10004 : 获取店铺列表时服务器返回异常
(二)Action : startBrowser
1、说明:启动店铺,关闭店铺需要调用stopBrowser,连续两次调用startBrowser会视为重启
2、请求参数:
{
"userInfo": "{\"company\":\"公司\",\"username\":\"用户名\",\"password\":\"密码\"}",
"action": "startBrowser",
"browserOauth": "店铺ID",
"isHeadless": true, //是否启用无头模式
"requestId": "全局唯一标识"
}
3、响应结果:
{
"statusCode": "状态码",
"err": "异常信息",
"action": "startBrowser",
"browserOauth": "店铺ID",
"requestId": "全局唯一标识",
"launcherPage": "店铺所属平台的默认启动页面",
"debuggingPort": "调试端口"
}
4、启动Selenium 必要参数
//根据startBrowser返回结果启动Selenium
ChromeOptions options = new ChromeOptions();
//调试端口
options.setExperimentalOption("debuggerAddress", "127.0.0.1:" + debuggingPort);
//删除其他不需要参数
5、状态码:
(1)0 : 成功
(2)-10000 : 未知异常
(3)-10001 : 内核窗口创建失败
(4)-10002 : Socket参数非法
(5)-10003 : 登录失败
(6)-10004 : browserOauth缺失
(7)-10005 : 该店铺上次请求的startBrowser还未执行结束
(8)大于零的状态码:
1 : 初始化数据失败
2 : 检测到当前IP无法正常使用,请联系客服
4 : 初始化时区失败
5 : 初始化代理失败
6 : 初始化黑白名单
7 : 启动内核失败
8 : 初始化浏览器个人目录
9 : 初始化Cookies失败
11 : 初始化浏览器设置文件
13 : 初始化代理信息配置
(三)Action : stopBrowser
1、说明:关闭店铺窗口
2、请求参数:
{
"userInfo": "{\"company\":\"公司\",\"username\":\"用户名\",\"password\":\"密码\"}",
"action": "stopBrowser",
"requestId": "全局唯一标识"
}
3、响应结果:
{
"statusCode": "状态码",
"err": "异常信息",
"action": "stopBrowser",
"requestId": "全局唯一标识"
}
4、状态码:
(1) 0 : 成功
(2)-10000 : 未知异常
(3)-10002 : Socket参数非法
(4)-10003 : 登录失败
(四)Action : getBrowserEnvInfo
1、说明:和startBrowser类似,区别就是内核窗口startBrowser由主程序启动,getBrowserEnvInfo由Webdriver启动
2、请求参数
{
"userInfo": "{\"company\":\"公司\",\"username\":\"用户名\",\"password\":\"密码\"}",
"action": "getBrowserEnvInfo",
"browserOauth": "店铺ID",
"isHeadless": true, //是否启用无头模式
"requestId": "全局唯一标识"
}
3、响应结果:
{
"statusCode": "状态码",
"err": "异常信息",
"action": "getBrowserEnvInfo",
"browserOauth": "店铺ID",
"requestId": "全局唯一标识",
"browserPath": "内核exe所在位置",
"launcherPage": "店铺所属平台的默认启动页面",
"browserArguments": "启动必要参数",
"debuggingPort": "调试端口"
}
4、启动Selenium 必要参数
//根据getBrowserEnvInfo 返回结果启动Selenium
ChromeOptions options = new ChromeOptions();
//内核exe所在位置
options.addArguments(browserArguments);
//启动必要参数
options.setBinary(browserPath);
//调试端口
options.addArguments("--remote-debugging-port=" + debuggingPort);
5、状态码:参考Action : startBrowser
(五)Action : heartbeat
1、说明:非必要接口,只是用于保活Socket连接
2、请求参数
{
"userInfo": "{\"company\":\"公司\",\"username\":\"用户名\",\"password\":\"密码\"}",
"action": "heartbeat",
"requestId": "全局唯一标识"
}
3、响应结果:
{
"statusCode": "状态码",
"err": "异常信息",
"action": "heartbeat",
"requestId": "全局唯一标识"
}
4、状态码:
(1) 0 : 成功
(2)-10000 : 未知异常
(3)-10002 : Socket参数非法
(4)-10003 : 登录失败
(六)Action : exit
1、说明:正常退出超级浏览器主进程,会自动关闭已启动店铺并保持店铺cookie等信息。
2、请求参数:
{
"userInfo": "{\"company\":\"公司\",\"username\":\"用户名\",\"password\":\"密码\"}",
"action": "exit",
"requestId": "全局唯一标识"
}
3、响应码:
4、状态码:
(1) 0 : 成功
(2)-10000 : 未知异常
(3)-10002 : Socket参数非法
(4)-10003 : 登陆失败
五、getBrowserList中的SiteId说明
index | id | name |
---|---|---|
1 | 1 | 美国亚马逊 |
2 | 2 | 加拿大亚马逊 |
3 | 3 | 日本亚马逊 |
4 | 4 | 英国亚马逊 |
5 | 5 | 法国亚马逊 |
6 | 7 | 意大利亚马逊 |
7 | 10 | 德国亚马逊 |
8 | 11 | 西班牙亚马逊 |