Tôi gặp sự cố khi chạy jQuery trong PhantomJS. Tôi đã tìm thấy câu trả lời this, mà nói về không có biến có sẵn bên trong chức năng đánh giá nhưng câu hỏi là về một mô-đun nút và trên ví dụ của tôi, tôi chỉ gọi console.log
bên trong chức năng đánh giá. Tôi đã đặt câu hỏi này trên GitHub too.Trên PhantomJS Tôi không thể bao gồm jQuery và không có jQuery Tôi không thể đăng dữ liệu biểu mẫu
Trước đây, đối với một số trang, mã evaluate
sau đây đã không thực thi. Bây giờ mà @ b1f56gd4 đã cung cấp một số trợ giúp, nó bây giờ in tin nhắn; Tôi không thể thực hiện được nhưng bây giờ tôi có thể thấy điều này:
Trang tại https://login.yahoo.com/ chạy nội dung không an toàn từ http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js.
Tôi không thể tải jQuery từ tên miền khác và các tùy chọn --local-to-remote-url-access=true
hoặc --web-security=false
không có sự khác biệt.
Tôi sẽ thử tải jQuery cục bộ. Đây là mã:
console.log('Loading a web page');
var url = 'https://login.yahoo.com/';
var page = require('webpage').create();
console.log('Setting error handling');
page.onConsoleMessage = function (msg) {
console.log(msg);
};
page.onError = function (msg, trace) {
console.log(msg);
trace.forEach(function(item) {
console.log(' ', item.file, ':', item.line);
})
phantom.exit();
}
console.log('Error handling is set');
console.log('Opening page');
page.open(url, function (status) {
if (status != 'success') {
console.log('F-' + status);
} else {
console.log('S-' + status);
//-------------------------------------------------
var jsLoc = '';
jsLoc = 'jquery.min.js'; // to load local
//jsLoc = 'http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js'; // to load remote
var func = function(pg){
console.log('Function called');
console.log('Page evaluating');
console.log(pg);
pg.evaluate(function() {
console.log('Page evaluate started');
//---
var loginVar = '[email protected]';
var pwdVar = 'itsmypass_445f4hd564hd56f46s';
//---
$("#login_form #username").value = loginVar;
$("#login_form #passwd").value = pwdVar;
//---
});
console.log('Rendering');
pg.render('ystsA.png');
console.log('Rendered');
}
if (typeof jQuery == 'undefined') {
console.log('JQuery Loading'); // <<<<==== Execute only until here
console.log('Source:['+jsLoc+']');
var rs = page.includeJs(jsLoc, function() // <<<<===== Fail here, jsLoc was changed to load locally and after tried remotely, i tried use page.injectJs but fail too
{
console.log('JQuery Loaded'); // <<<< ===== Never reach here, no matter if loading local or remote script in include above
func(page);
});
page.render('ystsB.png');
} else {
console.log('JQuery Already Loaded');
func(page);
page.render('ystsC.png');
}
//-------------------------------------------------
}
phantom.exit();
});
Sau khi đọc @ g4d564w56 câu trả lời tôi đã làm tất cả mà không có JQuery thì tôi có thể điền vào hộp văn bản nhưng không thể nhấp vào nút để đăng trên biểu mẫu đăng nhập.
Xem mã mới:
console.log('Loading a web page');
var url = 'https://login.yahoo.com/';
var page = require('webpage').create();
console.log('Setting error handling');
page.onConsoleMessage = function (msg) {
console.log(msg);
};
page.onError = function (msg, trace) {
console.log(msg);
trace.forEach(function(item) {
console.log(' ', item.file, ':', item.line);
})
phantom.exit();
}
console.log('Error handling is set');
console.log('Opening page');
page.open(url, function (status) {
if (status != 'success') {
console.log('F-' + status);
} else {
console.log('S-' + status);
//-------------------------------------------------
var jsLoc = '';
jsLoc = 'jquery.min.js'; // to load local
//jsLoc = 'http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js'; // to load remote
var act01 = function(pg){
console.log('Function called');
console.log('Page evaluating');
console.log(pg);
pg.evaluate(function() {
var getElmById = function(id){
return document.getElementById(id);
}
console.log('Page evaluate started');
//---
var loginVar = '[email protected]';
var pwdVar = 'itsmypass_445f4hd564hd56f46s';
//---
getElmById("username").value = loginVar;
getElmById("passwd").value = pwdVar;
getElmById("login_form").submit(); /// <<<<==== now its dont work !!!
//---
});
console.log('Rendering');
pg.render('ystsA.png');
console.log('Rendered');
}
act01(page);
//-------------------------------------------------
}
phantom.exit();
});
Giải pháp ở đây: http://stackoverflow.com/questions/11121734/evaluate-doesnt-work/11121792#11121792 –
@ b1f56gd4 Cảm ơn rất nhiều b1f56gd4. Vấn đề là phantmJs không thực thi console.log bên trong khối đánh giá theo mặc định, trang ở trên hiển thị mẹo lừa. Bây giờ tôi có thể nhìn thấy rất nhiều "Trang tại nội dung không an toàn chạy từ" và "JavaScript không an toàn để truy cập khung bằng URL từ khung với Tên miền URL, giao thức và cổng phải khớp.". Cảm ơn bây giờ tôi có thể xem và gỡ lỗi. – newway
Tôi biết câu hỏi này là một năm cũ, nhưng đối với những người tìm kiếm câu hỏi này bằng cách tìm kiếm từ google vấn đề trong trường hợp cụ thể này là một tài nguyên http đang được sử dụng trong một trang https. Để tải jquery tất cả những gì bạn phải làm là sử dụng url https. – derickito