大家知道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
|
import chrome.driver;
var driver = chrome.driver();
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;
var driver = electron.driver();
driver.addArguments("--app=http://www.so.com");
var browser = driver.startBrowser();
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")
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();
app.external = {
test = function(){ app.msgbox("页面js调用了aardio函数"); } }
app.start("http://www.aardio.com",function(args){
var browser = driver.startAppBrowser(app,args);
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);
|