Ich habe dieses Skript geändert, und jetzt ist es funktioniert:
/**
* Wait until the test condition is true or a timeout occurs. Useful for waiting
* on a server response or for a ui change (fadeIn, etc.) to occur.
*
* @param testFx javascript condition that evaluates to a boolean,
* it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
* as a callback function.
* @param onReady what to do when testFx condition is fulfilled,
* it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
* as a callback function.
* @param timeOutMillis the max amount of time to wait. If not specified, 3 sec is used.
*/
"use strict";
function waitFor(testFx, onReady, timeOutMillis) {
var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 5000, //< Default Max Timout is 3s
start = new Date().getTime(),
condition = false,
interval = setInterval(function() {
if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) {
// If not time-out yet and condition not yet fulfilled
condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code
} else {
if(!condition) {
// If condition still not fulfilled (timeout but condition is 'false')
console.log("'waitFor()' timeout");
phantom.exit(1);
} else {
// Condition fulfilled (timeout and/or condition is 'true')
console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms.");
typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled
clearInterval(interval); //< Stop this interval
}
}
}, 250); //< repeat check every 250ms
};
function click(sel){var event=document.createEvent('MouseEvents');event.initMouseEvent('click',1,1,window,1,0,0,0,0,0,0,0,0,0,null);document.querySelector(sel).dispatchEvent(event);}
var page = require('webpage').create();
// Open Twitter on 'sencha' profile and, onPageLoad, do...
page.open("https://twitter.com/sencha", function (status) {
// Check for page load success
if (status !== "success") {
console.log("Unable to access network");
} else {
page.evaluate(function(click) {click('a[id="signin-link"]');},click)//,click will be available
// Wait for 'signin-dropdown' to be visible
waitFor(function() {
// Check in the page if a specific element is now visible
return page.evaluate(function() {
return $("div#signin-dropdown").is(":visible");
});
}, function() {
console.log("The sign-in dialog should be visible now.");
phantom.exit();
});
}
page.render('sencha.png');
});
Nun senden wir ein Klicken, das Dropdown-Menü zu öffnen und sichtbar machen. –
* Meta-Kommentar: * Hallo Igor, ich habe bemerkt, dass du manchmal Antworten löschst, die du keine Rückmeldung erhalten hast. Bitte tu das nicht. Wenn es keine andere bessere Antwort gibt, kann Ihre Antwort tatsächlich zukünftigen Lesern helfen. Ich kann auch sagen, dass einige Fragesteller tatsächlich vergessen, dass sie eine Frage gestellt haben und manchmal ihre Frage zu einem viel späteren Zeitpunkt erneut aufsuchen werden. Ich habe Antworten über ein Jahr nach der Veröffentlichung erhalten. Bitte besuche [deine kürzlich gelöschten Antworten] (http://stackoverflow.com/users/recently-deleted-answers/4535610) und schaue sie durch, um zu sehen, ob du einige von ihnen wiederherstellen kannst. –