2016-03-18 11 views
6

Jak mogę sprawdzić, czy element jest klikalny za pomocą js? Chcę kliknąć element, ale gdy uruchomię noktowizor, selen nie kliknie tego elementu, ponieważ nie można go jeszcze kliknąć.Jak mogę sprawdzić, czy element jest klikalny za pomocą aplikacji nocnych?

+0

Co masz na myśli klikania? Czy element jest wyłączony? Czy to jest ukryte? –

+0

Chciałbym zobaczyć przykład, który byłby odpowiednikiem 'waitUntilElementIsEnabled()'. W Selenium znajduje się pomocnik, który łączy sprawdzanie isEnabled z sprawdzeniem isVisible przed zwróceniem "true". – Monkpit

+0

Zobacz [to wyszukiwanie w Github Selenium] (https://github.com/SeleniumHQ/selenium/search?l=python&q=clickable&type=Code&utf8=%E2%9C%93) dla przykładów – Monkpit

Odpowiedz

1

Czy możesz pokazać przykładowy element, zazwyczaj powinna być nazwa atrybutu "wyłączona", jeśli przycisk nie jest klikalny, to powinno działać.

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

Chciałbym zobaczyć przykład będzie to odpowiednik 'waitUntilElementIsEnabled()'. W Selenium znajduje się pomocnik, który łączy sprawdzanie isEnabled z sprawdzeniem isVisible przed zwróceniem "true". – Monkpit

10

Coś takiego powinno działać. Daj mi znać, jeśli masz pytania:

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; 

Dodaj ten kod jako plik do swojego folderu poleceń. Powinien on nazywać się waitUntilElementIsClickable.js lub cokolwiek chcesz, aby twoje polecenie było.

użycia:

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

Można także użyć elementów strony:

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

Hej, starałem swój kod, ale to daje błąd składni '' 'waitForElementClickable.js: 57 .Następnie ((wyników) => { ^^ SyntaxError: Nieoczekiwany token => ' '' Można proszę mi pomóc? –

+0

Ahh, kod jest częściowo napisany w formacie ES6, zaktualizowałem go tak, aby działał z czystym ES5 –

+0

Dziękuję za szybką odpowiedź, teraz działa. –

Powiązane problemy