是的,使用普通的 PhantomJS 很容易做到这一点。您也可以为此使用 ZombieJS 或 CasperJS。它们使处理许多步骤变得更容易,而不会遇到回调地狱或静态代码。
我添加了点击和打字的必要功能。设置用户代理字符串是必要的,否则 Google 将提供可能无法在(旧)PhantomJS 1.x 引擎上运行的代码。
var page = require('webpage').create(),
classical = true;
// This userAgent works good with GM
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1';
page.viewportSize = {
width: 1280,
height: 800
};
function click(selector){
page.evaluate(function(selector){
// taken from here: http://stackoverflow.com/a/15948355
var ev = document.createEvent("MouseEvent");
ev.initMouseEvent(
"click",
true /* bubble */, true /* cancelable */,
window, null,
0, 0, 0, 0, /* coordinates */
false, false, false, false, /* modifier keys */
0 /*left*/, null
);
document.querySelector(selector).dispatchEvent(ev);
}, selector);
}
function type(text){
page.evaluate(function(text, classical){
var el = document.querySelector(classical ? "#gbqfq" : "#searchboxinput");
el.value = text;
el.focus();
}, text, classical);
page.sendEvent('keypress', page.event.key.Enter);
}
page.open("https://www.google.com/maps", function (status) {
if (status !== 'success') {
console.log('Unable to access network');
phantom.exit();
} else {
if (classical) {
click("#paneltoggle2");
}
setTimeout(function(){
page.render("1.png");
click(classical ? "#mv-primary-container > .mv-primary" : "button.widget-minimap-shim");
}, 1000); // +1 sec
setTimeout(function(){
page.render("2.png");
type("bern");
}, 11000); //+10 sec
setTimeout(function(){
if (classical) {
click("#paneltoggle2");
}
}, 16000); //+5 sec
setTimeout(function(){
page.render("3.png");
phantom.exit();
}, 21000); //+5 sec
}
});
如果您使用的是 --ssl-protocol=tlsv1 运行它。使用clipRect 裁剪图像以使控件不可见也可能会有所帮助。