2016-03-18 3 views
6

Wie kann ich überprüfen, bis ein Element mit Nightwatch js klickbar ist? Ich möchte auf ein Element klicken, aber wenn ich Nightwatch starte, klickt Selen nicht auf das Element, weil es noch nicht anklickbar ist.Wie kann ich überprüfen, bis ein Element mit Nightwatchjs anklickbar ist?

+0

Was Sie klickbare meinen wir:

browser.waitUntilElementIsClickable('.some.css'); 

Sie auch Seitenelemente verwenden können? Ist das Element deaktiviert? Ist es versteckt? –

+0

Ich möchte ein Beispiel sehen, das dem 'waitUntilElementIsEnabled()' entspricht. Es gibt einen Helfer in Selenium, der einen Check für isEnabled mit einem Check für isVisible kombiniert, bevor er 'true' zurückgibt. – Monkpit

+0

Siehe [diese Suche auf Selenium Github] (https://github.com/SeleniumHQ/selenium/search?l=python&q=clickable&type=Code&utf8=%E2%9C%93) für Beispiele – Monkpit

Antwort

1

Können Sie ein Beispielelement anzeigen, normalerweise sollte ein Attributname "deaktiviert" sein, wenn die Schaltfläche nicht anklickbar ist, sollte dies funktionieren.

browser.assert.attributeEquals(yourCSS, 'disabled', true) 
+0

Ich möchte ein Beispiel sehen das wäre das Äquivalent von 'waitUntilElementIsEnabled()'. Es gibt einen Helfer in Selenium, der einen Check für isEnabled mit einem Check für isVisible kombiniert, bevor er 'true' zurückgibt. – Monkpit

10

So etwas sollte funktionieren. Lassen Sie mich wissen, wenn Sie Fragen haben

var util = require('util'); 
var events = require('events'); 

/* 
* This custom command allows us to locate an HTML element on the page and then wait until the element is both visible 
* and does not have a "disabled" state. It rechecks the element state every 500ms until either it evaluates to true or 
* it reaches maxTimeInMilliseconds (which fails the test). Nightwatch uses the Node.js EventEmitter pattern to handle 
* asynchronous code so this command is also an EventEmitter. 
*/ 

function WaitUntilElementIsClickable() { 
    events.EventEmitter.call(this); 
    this.startTimeInMilliseconds = null; 
} 

util.inherits(WaitUntilElementIsClickable, events.EventEmitter); 

WaitUntilElementIsClickable.prototype.command = function (element, timeoutInMilliseconds) { 
    this.startTimeInMilliseconds = new Date().getTime(); 
    var self = this; 
    var message; 

    if (typeof timeoutInMilliseconds !== 'number') { 
    timeoutInMilliseconds = this.api.globals.waitForConditionTimeout; 
    } 

    this.check(element, function (result, loadedTimeInMilliseconds) { 
    if (result) { 
     message = '@' + element + ' was clickable after ' + (loadedTimeInMilliseconds - self.startTimeInMilliseconds) + ' ms.'; 
    } else { 
     message = '@' + element + ' was still not clickable after ' + timeoutInMilliseconds + ' ms.'; 
    } 
    self.client.assertion(result, 'not visible or disabled', 'visible and not disabled', message, true); 
    self.emit('complete'); 
    }, timeoutInMilliseconds); 

    return this; 
}; 

WaitUntilElementIsClickable.prototype.check = function (element, callback, maxTimeInMilliseconds) { 
    var self = this; 

    var promises =[]; 
    promises.push(new Promise(function(resolve) { 
    self.api.isVisible(element, function(result) { 
     resolve(result.status === 0 && result.value === true); 
    }); 
    })); 

    promises.push(new Promise(function(resolve) { 
    self.api.getAttribute(element, 'disabled', function (result) { 
     resolve(result.status === 0 && result.value === null); 
    }); 
    })); 

    Promise.all(promises) 
    .then(function(results) { 
     var now = new Date().getTime(); 
     const visibleAndNotDisabled = !!results[0] && !!results[1]; 
     if (visibleAndNotDisabled) { 
     callback(true, now); 
     } else if (now - self.startTimeInMilliseconds < maxTimeInMilliseconds) { 
     setTimeout(function() { 
      self.check(element, callback, maxTimeInMilliseconds); 
     }, 500); 
     } else { 
     callback(false); 
     } 
    }) 
    .catch(function(error) { 
     setTimeout(function() { 
     self.check(element, callback, maxTimeInMilliseconds); 
     }, 500); 
    }); 
}; 

module.exports = WaitUntilElementIsClickable; 

Fügen Sie diesen Code als eine Datei in Ihren Ordner Befehle. Es sollte waitUntilElementIsClickable.js oder was auch immer Sie wollen, dass Ihr Befehl sein soll.

Verbrauch ist:

var page = browser.page.somePage(); 
page.waitUntilElementIsClickable('@someElement'); 
+0

Hey, habe ich versucht, den Code, aber es gibt Syntaxfehler '' 'waitForElementClickable.js: 57 .then ((Ergebnisse) => { ^^ Syntaxerror: Unexpected token => ' '' Sie können bitte helfen Sie mir –

+0

Ahh, der Code ist teilweise in ES6-Format geschrieben, ich aktualisiert, so dass es mit reinem ES5 funktionieren sollte –

+0

Danke für Ihre schnelle Antwort, jetzt funktioniert es .. –

Verwandte Themen