私は現在、ヘッドレスブラウザ(PhantomJS)とすべてのDOMナビゲーションと可能なアクション(ダウンロードを除く)が必要な自動テストスクリプトで作業しています。 したがって、PhantomJSは適合するはずです。PhantomJSを使用したjQueryバグ
しかし、私は、次のエラーとしてのjavascript jQueryを使ってPhantomJSを使用することはできません。
var page = require('webpage').create();
page.open('http://mywebsite.com/', function() {
function dothat() {
console.log('0 started');
$('#id').children().eq(0).click();
console.log('0 finished');
return main(1, 0);
}
}
dothat()
はここでスクリプトが「0開始」を停止します。私がロードするページはjQueryを使用していますので、私はそれをダウンロードする必要はありません。それでも、ロードしてみましょう。
var page = require('webpage').create();
page.open('http://mywebsite.com/', function() {
page.injectJs('jquery-2.2.1.min.js');
function dothat() {
console.log('0 started');
$('#id').children().eq(0).click();
console.log('0 finished');
return main(1, 0);
}
}
dothat()
はい(非常にしっかりと)私は ...同じディレクトリにファイルをローカルに持っており、それは、そのエラーを示しています。あなたはそれを修正する
TypeError: undefined is not a constructor (evaluating 'jQuery.easing[jQuery.easing.def](t,e,n,i,a)')
何をしていることをお勧めしますか? これはPhantomJSの内部のバグなので、私はUbuntuでFirefoxとXvfbを試してみるべきですか、それともどこかで私のエラーですか? 私は最初にコードを非jQueryバージョンに変更しましたが、クラスで大きなセレクタが必要で、いくつかのオブジェクトをクリックする必要があります...
私に解決策を教えていただきありがとうございます!
編集1:最初の回答からわかったことに従ってこれを変更しました。今すぐコンソールに何も印刷されない
var page = require('webpage').create();
page.onConsoleMessage = function(msg, lineNum, sourceId) {
console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
};
page.open('http://mywebsite.com/', function() {
page.injectJs('jquery-2.2.1.min.js');
var result = page.evaluate(function() {
function dothat() {
console.log('0 started');
$('#id').children().eq(0).click();
console.log('0 finished');
return main(1, 0);
}
function main(x, y) {
if (x === 0) {
return setTimeout(dothat(), y);
} else if (x === 1) {
return setTimeout(dothis(), y);
}
}
return main(0, 5000); //first launch
}
});
私はそれがあなたが指摘していたものだったかどうかは分かりません。
EDIT 2:これはgoogle.comに行き、私としてログインしたい本当のスクリプトです。ただし、スクリプトは意図したとおりに動作しません。下記を参照してください。
var page = require('webpage').create();
page.onConsoleMessage = function(msg) {
console.log('CONSOLE: ' + msg);
};
page.open('https://google.com/', function() {
page.injectJs('jquery-2.2.1.min.js');
page.evaluate(function() {
function dofirst() {
$('#gb_70').click();
return main(1, 0);
}
function dosecond() {
document.getElementById('Email').value = '[email protected]';
$('#next').click();
return main(2, 0);
}
function dothird() {
document.getElementById('Passwd').value = 'mypwd';
$('#signIn').click();
}
function main(i, j) {
if (i === 0) {
console.log('launching 0');
return setTimeout(dofirst(), j); // connections
}
else if (i === 1) {
console.log('launching 1');
return setTimeout(dosecond(), 5000);
}
else if (i === 2) {
console.log('launching 2');
return setTimeout(dothird(), 5000);
}
}
return main(0, 5000);
});
});
ご覧のとおり、mainは、手順を遅らせるために使用している関数です。コードが動作すると私は、このエラー(またはそれらを)返していませんが :
TypeError: null is not an object (evaluating 'document.getElementById('Email').value = '[email protected]'')
undefined:7 in dosecond
:22 in main
:4 in dofirst
:18 in main
:29
:30
は私を支援しようと保ついただきありがとうございます!
'doThat()'はプライベートなので、 ' – dandavis
'にすることができますが、実際のケースでは失敗します。 –