2017-07-10 7 views
2

Ich versuche zu überprüfen, ob ein Element nicht existiert, aber es ist mit Timeout-Problem fehlgeschlagen. Aus meiner Beobachtung heraus habe ich herausgefunden, dass der Fahrer zuerst versucht, dieses Element herauszufinden und dann darauf zu warten, dass das Element verschwindet, anstatt zu prüfen, ob ein Element existiert oder nicht. Ich habe unten Methoden versucht.Überprüfen, ob ein Element nicht vorhanden ist

1. browser.element.all(selector) 
2. browser.driver.findElements(selector) 
3. browser.isElementPresent(browser.element(selector)) 
4. element(selector).isPresent() 

Hintergrund: Wenn eine Schaltfläche geklickt wird, wird ein modaler erscheinen. Es hat Schaltflächen zum Abbrechen und Speichern. Beim Klicken auf die Schaltfläche Abbrechen verschwindet das modale Fenster. Jetzt versuche ich eine Erwartungsbedingung zu schreiben, um zu überprüfen, ob das Modal verschwunden ist oder nicht.

Alle oben genannten sind fehlgeschlagen. Bitte sagen Sie mir einen korrekten Weg, wo ich prüfen kann, ob ein Element sofort existiert. Hier

ist der Fehler für all oben

Error: function timed out after 60000 milliseconds 

Ich bin wirklich nicht sicher, warum Protractor nicht in der Lage ist, mir zu helfen, nur zu überprüfen, wenn das Element nicht in dem DOM ist. Ich habe alles Mögliche versucht. Jede Methode versucht herauszufinden, ob ein bestehendes Element in einen nicht existierenden Zustand übergeht oder nicht. Dann warum diese vielen APIs, wenn alle die gleiche Arbeit machen.

+0

Hat angular.element (document) .find ('...') nicht? – rrd

+0

Es ist im Inneren Winkelmesser. Ich vermeide Browser-Skriptausführung. – Adapter

+0

Dies ist keine gute Problembeschreibung. Bitte fügen Sie Details hinzu, was passiert ist, als Sie diese Selektoren verwendet haben. Haben Sie einen Fehler/eine Ausnahme oder wird der Code weitergegeben und passiert nichts? Ohne dieses und das relevante HTML wäre es nur ein Schuss in die Dunkelheit. – demouser123

Antwort

-1
expect($(".example").isPresent()).toBe(false) 

Jede Methode in Winkelmesser gibt ein Versprechen. Sie müssen einen Helfer verwenden, um es zu lösen. Wie die eingebaute Funktion expect.

+0

Ich habe Selektor in dieser Form 'by.css (selectorText)'. Ich kann das nicht ändern, also kann ich '$' – Adapter

+0

$ nicht verwenden. Es ist das gleiche in Winkelmesser: https://github.com/angular/protractor/blob/master/docs/locators.md – clint

+0

Ok. Es funktioniert auch nicht. Habe gerade die Frage aktualisiert. Trotzdem versucht es das Element zu finden und darauf zu warten. Dann tritt eine Zeitüberschreitung auf. – Adapter

0

Unten ist ein Beispiel von Winkelmesser api docs genommen

expect(element(by.binding('notPresent')).isPresent()).toBe(false);

so sollten Sie Ihre Lösung,

expect(element(by.css('.elementClass')).isPresent()).toBe(false);

0

Ich hatte ein ähnliches Problem sein, könnten Sie mehr Glück mit expectedConditions finden warten, bis das Modal weg ist, bevor Sie die expect-Anweisung versuchen.

var WaitForElement = function(item, timeout = 15000) { 
    var el = element(by.css(item)); 
    var EC = protractor.ExpectedConditions; 
    browser.wait(EC.not(EC.presenceOf(el)), timeout).then(function(){ 
    return; 
    }); 
}; 

WaitForElement('.example').then(function() { 
    expect(element(by.css('.example')).isPresent()).toBe(false); 
} 

Dies wird Winkelmesser Warten auf das angegebene Element machen, (‚.example‘ in diesem Fall) zu verschwinden, bevor die Anweisung erwarten laufen, sonst wird es nach 15 Sekunden Timeout und die erwarten, wird scheitern.

+0

Dies funktioniert auch nicht :(Es wartet immer noch auf das Element vorhanden sein. Aber Element ist lange vor – Adapter

+0

[M. Hudson] (https://stackoverflow.com/users/7709399/m-hudson), ich Ich benutze Ihre Methode, wie (var EC = protractor.ExpectedConditions;), Alles funktioniert gut, aber in der Konsole bekomme ich wie "Exception Throwed, Selen am Leben erhalten". Und Test sind alle erfolgreich. Kennen Sie den Grund? Wie um es zu lösen? –

2

Nicht sicher, warum Sie browser. für Ihre Selektoren verwenden, noch was Ihre selector tatsächlich ist, aber ich vermute, dass Sie mehrere Probleme treffen.

Erstens, .isPresent() fragt wirklich ist es in der dom; isDisplayed() fragt ist es sichtbar. Daher hängt Ihre Strategie hier davon ab, ob Ihr Modell aus dem Dom entfernt oder versteckt ist (zB display:none etc ...).

Zweitens scheint es nicht, dass Sie das Versprechen behandeln, dass eine dieser Methoden zurückkehrt. Sie erwähnen auch nicht, wenn Sie dies in einem expect ausführen (was automatisch auf das Versprechen zu lösen wartet).

Drittens ist es nicht klar, ob Ihr modal Selektor ein einzelnes Element zurückgibt, oder mehrere (auch wenn Sie die später mit der Nutzung von element.all zeigen Sie.

Lange Geschichte etwas länger, hier ist ein Beispiel, wie Sie vielleicht überprüfen wenn Ihr modal angezeigt wird, da die Annahmen, die Ihre modal eine Klasse von .myModal hat, ist das einzige, und es wird aus dem dom entfernt, wenn nicht angezeigt.

$('.myModal').isPresent().then(function(inDom) { 
    return inDom; // returns bool 
}; 

der obige Code Ihr Element ergreift, überprüft, ob es ist in der dom, handhabt das versprechen über .then und re wird wahr/falsch, wenn das Element im Dom ist.

Das heißt, Ihr Code könnte mehrere Modalitäten haben, versteckt über CSS. In diesem Fall müssen Sie eine Strategie für diesen Fall finden. Vielleicht fügt Ihr Code versteckten Elementen eine .shown Klasse hinzu? Großartig, überprüfen Sie die Anwesenheit von $('.myModal.shown'). Vielleicht hat Ihr Code mehrere versteckte Modale in der Dom ... weniger groß, aber Sie könnten durch jedes Element durchlaufen, und testen, ob beliebig mit isDisplayed() angezeigt werden.

Hoffnung hilft das ein wenig ...

Verwandte Themen