大家知道Chrome每个版本的适用ChromeDriver版本都不一样,
安装不同的Chrome就要去下载不同的ChromeDriver.exe,而且还要命令行启动,绑定固定端口一搞不好还会跟别的进程冲突了。

现在用aardio 最新版中提供的 chrome.driver 所有麻烦都可以解决了,
chrome.driver 会自动查找Chrome的安装位置、版本号,自动匹配最合适的ChromeDriver版本,并且负责自动下载安装,自动分配空闲端口,所有事情全自动准备好,只要运行下面的代码就可以了。

现在看代码,用法非常简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//WebDriver自动化

import chrome.driver;

//创建chromeDriver对象
//协议文档 https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol
var driver = chrome.driver();

//创建会话,打开chrome浏览器,Chrome新版会强制显示控制台
var browser = driver.startBrowser();

//打开网页
browser.go("http://www.so.com")

//查找文本输入框
var ele = browser.querySelector("#input");

//在网页输入框输入内容
ele.setValue( "ChromeDriver" )

//模拟点击按钮
browser.querySelector("#search-button").click();

下面的问题在新版中已解决,可忽略:

注意 Chrome新版会强制显示控制台( 隐藏也会强行弹出黑窗口,旧版可以隐藏这个黑窗口 ),

如果想隐藏黑窗口,那么可以用旧版Chrome,在创建 chrome.driver对象时可以在参数中自定义chrome.exe的路径。

调用 Electron

也可以通过 ChromeDriver 调用 Electron,几句代码就可以了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import electron.driver;

//创建chromeDriver对象,协议文档
var driver = electron.driver();

//替换electron默认的开始页
driver.addArguments("--app=http://www.so.com");

//创建会话,打开chrome浏览器,Chrome新版会强制显示控制台
var browser = driver.startBrowser();

//打开网页
//browser.go("http://www.so.com")

//查找文本输入框
var ele = browser.querySelector("#input");

//在网页输入框输入内容
ele.setValue( "ChromeDriver" )

//模拟点击按钮
browser.querySelector("#search-button").click();

修改 User Agent

1
2
3
4
5
6
7
8
import chrome.driver;

var driver = chrome.driver();

driver.addArguments("--user-agent=mychrome")

//打开网页
driver.startBrowser().go("http://www.ip138.com/useragent/")

chrome启动参数大全:

设置代理

1
2
3
4
5
6
7
8
import chrome.driver;

var driver = chrome.driver();

driver.setProxy(
proxyType = "manual";
httpProxy = "127.0.0.1:12043"
)

也可以下面这样写:

1
2
3
4
5
6
7
8
9
10
import chrome.driver;

var driver = chrome.driver();

var browser = driver.startBrowser(
proxy ={
proxyType = "manual";
httpProxy = "127.0.0.1:12043"
}
);

新版功能

chrome.driver新版功能演示,操作chrome就像直接执行Javascript函数那么简单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import chrome.driver;

var driver = chrome.driver();

//启动浏览器
browser = driver.startBrowser();

//打开网页
browser.go("http://www.so.com")

//查询元素,并且使用元素的querySelector函数查询子元素
browser.querySelector("body").querySelector("#input").setValue( "ChromeDriver" )

//模拟点击按钮
browser.querySelector("#search-button").click()

隐藏控制台

网上一些讨论认为这个问题无解,WebDriver也没有找到相关参数,
直觉这个可能在启动参数里打开控制台,于是我写了一个假的 chrome.exe,再用 ChromeDriver.exe 调用他,代码如下:

1
2
3
4
5
6
7
import console;
import win.clip

win.clip.write(_CMDLINE)
console.log(_CMDLINE);

console.pause();

chrome.exe获得的启动参数如下:

1
--disable-background-networking --disable-client-side-phishing-detection --disable-default-apps --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --disable-web-resources --enable-automation --enable-logging --force-fieldtrials=SiteIsolationExtensions/Control --ignore-certificate-errors --load-extension="C:\Users\***\AppData\Local\Temp\***\internal" --log-level=0 --metrics-recording-only --no-first-run --password-store=basic --remote-debugging-port=0 --test-type=webdriver --use-mock-keychain --user-data-dir="C:\Users\***\AppData\Local\Temp\***" data:,

我们看到可疑参数--enable-logging
进一步测试发现:排除这个参数就可以关闭新版chrome启动跳出来的控制台窗口了,示例代码:

1
2
3
4
5
6
7
8
9
import chrome.driver;

var driver = chrome.driver( );
driver.setOptions(
excludeSwitches ={"enable-logging"} //注意这里参数前千万不要加 --
)

driver.addArguments("--app=http://www.aardio.com")
var browser = driver.startBrowser();

已更新 chrome.driver 默认禁用控制台窗口,

但仍然可以使用 driver.addArguments("--enable-logging") 启用这个参数。

app、driver 交互

aardio新版经过大力改进,
现在 chrome.app, chrome.driver 已经可以相互结合使用,chrome与aardio交互更加简单方便。
下面是一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import chrome.app;
var app = chrome.app();

import chrome.driver;
var driver = chrome.driver();

//指定允许chrome中使用JS直接调用的函数
app.external = {

test = function(){
app.msgbox("页面js调用了aardio函数");
}
}

//正式的启动chrome进程
app.start("http://www.aardio.com",function(args){

//启动浏览器,加载aardio.js,并打开ChromeDriver自动化接口
var browser = driver.startAppBrowser(app,args);

//执行JS脚本
browser.doScript(`
document.addEventListener("click", function(event) {
aardio.test();
});
`)

return browser;
});

win.loopMessage();

禁用自动化测试提示

方法一:

1
2
3
import chrome.driver;
var driver = chrome.driver();
driver.removeArguments("--enable-automation")

虽然不显示上面的提示了,但是弹出一个更大的警告。

方法二:

1
2
3
import chrome.driver;
var driver = chrome.driver();
driver.addArguments("--disable-infobars");

不显示上面的提示,也没有警告了,但是可以看到提示框显示然后快速的关掉,会闪烁一下。

方法三:

1
2
3
import chrome.driver;
var driver = chrome.driver();
driver.addArguments("--app=http://www.so.com/index.html");

用–app模式的方法完美,地址栏、提示框、警告都去掉了,

但是有一个奇怪的事情是,启动网址要写成 http://www.so.com/index.html 这样,如果不写 index.html 有时候会白屏,但不是每个网站都这样。

清理临时文件

Chrome每个进程只能绑定单独的用户目录 - 才能创建单独的远程调试端口,
ChromeDriver 的办法是每次都创建一个临时的用户目录,然后每次都创建新的临时用户目录,而且又不负责删除(其实可以设置为重启系统自动删除,不知道Chrome为什么没有这么做),所以我们只好自己清理了,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import console;
import fsys;
fsys.enum( fsys.getTempDir(), "scoped_dir*_*",
function(dir,filename,fullpath,findData){
if(!filename){
if( ..io.exist( io.joinpath(fullpath,"DevToolsActivePort") ) ){
fsys.delete(fullpath)
}
if( ..io.exist( io.joinpath(fullpath,"internal.zip") ) ){
fsys.delete(fullpath)
}
}
},false
);

console.pause(true);