PhantomJS 一页一页打开
PhantomJS open one page after another
我用这个例子创建了一个 phantomjs 代码来登录网站。
var page = require('webpage').create();
page.open("http://www.facebook.com/login.php", function(status) {
if (status === "success") {
page.onConsoleMessage = function(msg, lineNum, sourceId) {
console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
};
page.evaluate(function() {
console.log('hello');
document.getElementById("email").value = "email";
document.getElementById("pass").value = "password";
document.getElementById("u_0_1").click();
// page is redirecting.
});
setTimeout(function() {
page.evaluate(function() {
console.log('haha');
});
page.render("page.png");
phantom.exit();
}, 5000);
}
});
由此link。
https://gist.github.com/ecin/2473860
但我想通过按钮打开另一个 link 或直接打开它。我该怎么做?
这是一个更简单的例子。没用...
var page = require('webpage').create();
var url = "www.example.com";
page.open(url, function (status) {
setTimeout(function () {
page.evaluate(function () {
console.log('haha');
});
page.render("example.png");
phantom.exit();
}, 5000);
});
var url = "www.google.com";
page.open(url, function (status) {
setTimeout(function () {
page.evaluate(function () {
console.log('haha');
});
page.render("google.png");
phantom.exit();
}, 5000);
});
非常接近,现在将您的两个片段合二为一。 page.open()
是异步的,这就是为什么只有在第一个页面完成后才需要打开下一个页面的原因:
var page = require('webpage').create();
var url = "http://www.example.com";
page.onConsoleMessage = function(msg, lineNum, sourceId) {
console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
};
page.open(url, function (status) {
page.onConsoleMessage = function(msg, lineNum, sourceId) {
console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
};
page.evaluate(function() {
document.getElementById("email").value = "email";
document.getElementById("pass").value = "password";
document.getElementById("u_0_1").click();
// page is redirecting.
});
setTimeout(function () {
page.evaluate(function () {
console.log('haha');
});
page.render("example.png");
var url = "http://www.google.com";
page.open(url, function (status) {
setTimeout(function () {
page.evaluate(function () {
console.log('haha');
});
page.render("google.png");
phantom.exit();
}, 5000);
});
}, 5000);
});
要真正看到 page.evaluate()
中的 console.log()
,您需要注册 page.onConsoleMessage
活动。还有更多其他事件对调试有帮助。
不要忘记将协议(http:// 或 file:///)添加到您打开的 URL。 PhantomJS 在这方面有点挑剔。
而不是在执行某些操作后等待一段静态时间 (setTimeout()
) 直到加载下一页。您应该使用 page.onLoadFinished
事件。这对于导航密集型脚本来说是相当麻烦的。对较长的脚本使用 CasperJS。
通常 Element.click()
不起作用。 This question 对于这些情况有很多解决方案。
我用这个例子创建了一个 phantomjs 代码来登录网站。
var page = require('webpage').create();
page.open("http://www.facebook.com/login.php", function(status) {
if (status === "success") {
page.onConsoleMessage = function(msg, lineNum, sourceId) {
console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
};
page.evaluate(function() {
console.log('hello');
document.getElementById("email").value = "email";
document.getElementById("pass").value = "password";
document.getElementById("u_0_1").click();
// page is redirecting.
});
setTimeout(function() {
page.evaluate(function() {
console.log('haha');
});
page.render("page.png");
phantom.exit();
}, 5000);
}
});
由此link。 https://gist.github.com/ecin/2473860
但我想通过按钮打开另一个 link 或直接打开它。我该怎么做?
这是一个更简单的例子。没用...
var page = require('webpage').create();
var url = "www.example.com";
page.open(url, function (status) {
setTimeout(function () {
page.evaluate(function () {
console.log('haha');
});
page.render("example.png");
phantom.exit();
}, 5000);
});
var url = "www.google.com";
page.open(url, function (status) {
setTimeout(function () {
page.evaluate(function () {
console.log('haha');
});
page.render("google.png");
phantom.exit();
}, 5000);
});
非常接近,现在将您的两个片段合二为一。 page.open()
是异步的,这就是为什么只有在第一个页面完成后才需要打开下一个页面的原因:
var page = require('webpage').create();
var url = "http://www.example.com";
page.onConsoleMessage = function(msg, lineNum, sourceId) {
console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
};
page.open(url, function (status) {
page.onConsoleMessage = function(msg, lineNum, sourceId) {
console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
};
page.evaluate(function() {
document.getElementById("email").value = "email";
document.getElementById("pass").value = "password";
document.getElementById("u_0_1").click();
// page is redirecting.
});
setTimeout(function () {
page.evaluate(function () {
console.log('haha');
});
page.render("example.png");
var url = "http://www.google.com";
page.open(url, function (status) {
setTimeout(function () {
page.evaluate(function () {
console.log('haha');
});
page.render("google.png");
phantom.exit();
}, 5000);
});
}, 5000);
});
要真正看到 page.evaluate()
中的 console.log()
,您需要注册 page.onConsoleMessage
活动。还有更多其他事件对调试有帮助。
不要忘记将协议(http:// 或 file:///)添加到您打开的 URL。 PhantomJS 在这方面有点挑剔。
而不是在执行某些操作后等待一段静态时间 (setTimeout()
) 直到加载下一页。您应该使用 page.onLoadFinished
事件。这对于导航密集型脚本来说是相当麻烦的。对较长的脚本使用 CasperJS。
通常 Element.click()
不起作用。 This question 对于这些情况有很多解决方案。