Klicken Sie auf () - Funktion funktioniert nicht in Winkelmesser scripts
Ich bin versucht, zu automatisieren, meine tests mit Winkelmesser und Appium für eine AngularJS-Website mit Jasmin-Rahmen im iPad-simulator, sendkeys()
Funktion für Benutzername und Passwort, aber wenn ich Sie in den login-button, der test wird bestanden, aber der Vorgang nicht durchgeführt : keine Umleitung auf die Startseite, und nicht auf click-Effekt angezeigt wird für die login-Taste, ich bin mir sicher, dass element liegt richtig ! denn wenn ich erwarte, dass die gettext () - gleich auf"LOGIN" geführt wird, aber keine Umleitung, auch wenn ich browser.sleep(8000);
Hier mein test-script :
"use strict";
require("jasmine-expect");
var wd = require("wd");
describe('my app', function() {
it('should make the login test',function() {
// browser.ignoresynchronization=true;
browser.get("http://10.0.22.82:8080/jws/fetablet");
expect(browser.getCurrentUrl()).toEqual(("http://10.0.22.82:8080/jws/fetablet/#/login"));
element(by.model('credentials.username')).sendKeys('RET02').then(function(){
element(by.model('credentials.password')).sendKeys('RET02').then(function(){
element(by.css('.login-button')).click().then(function(){
browser.sleep(8000); expect(browser.getCurrentUrl()).not.toEqual("http://10.0.22.82:8080/jws/fetablet/#/login");
});
});
});
});
});
Gibt es eine andere Methode zu suchen, klicken Sie auf die Schaltfläche, richtig?
Hier mein html-code :
<div class="login_lang"> <md-button class="lang_button" ng-click="changeLang()">{{lang}}</md-button> </div>
<div layout="column" flex layout-align="center center" class="md-padding splash-background"> <div class="login-logo"> <img src="{{logoSrc}}"> </div> <form class="login-form" name="loginForm" ng-submit="login()">
<fieldset> <md-input-container class="md-block">
<label translate="login.USERNAME" ng-class="{'floating-label-rtl':dir==='rtl'}"
class="login-label">Username</label>
<input required ng-model="credentials.username" ng-focus="onFocus()" type="text">
<div ng-messages="loginForm.credentials.username.$error" ng-show="loginForm.credentials.username.$dirty">
<div ng-message="required" trans
late="login.MESSAGE_REQUIRED">This is required.</div> </div> </md-input-container> <md-input-container class="md-block"> <label translate="login.PASSWORD" ng-class="{'floating-label-rtl':dir==='rtl'}"
class="login-label">Password</label> <input required ng-model="credentials.password" ng-focus="onFocus()" type="pa
ssword">
<div ng-messages="loginForm.credentials.password.$error" ng-show="loginForm.credentials.password.$dirty"> <div ng-message="required" translate="login.MESSAGE_REQUIRED">This is required.</div> </div> </md-input-container>
<div layout-align="center center" layout="column" ng-if="oneTimePassword"> <p class="login-otp-message" translate="login.OTP_MESSAGE">Enter the code which you received by SMS</p> <md-button class="md-warn login-otp-retry" translate="login.OTP_RETRY" ng-click="retry()">Retry</md-button> </div> <md-input-container class="md-block" ng-if="oneTimePassword"> <label translate="login.SECURITY_CODE" class="login-label">Security code</label> <input required ng-model="credentials.securityCode" ng-focus="onFocus()" type="password"> <div ng-messages="loginForm.credentials.securityCode.$error" ng-show="loginForm.credentials.securityCode.$dirty"> <div ng-message="required" translate="login.MESSAGE_REQUIRED">This is required.</div> </div> </md-input-container> <div layout-align="center"> <section layout-align="center" layout="row" layout-sm="column"> <div id="login-error" md-caption class="msg-error" ng-show="error" class="label">{{error}}</div>
<md-button type="submit" class="md-raised login-button" ng-disabled="clicked" translate="login.LOGIN">Login</md-button> </section>
</div> </fieldset> </form> <md-divider></md-divider> <footer class="login-footer"> <div layout="row" layout-align="center center"> <md-button ng-click="goToCustomerCare()" class="login-footer-link" translate="login.CUSTOMER_CARE">Contact Customer Care</md-button> <div> | </div> <md-button ng-click="showDisclaimer()" class="login-footer-link" translate="login.DISCLAIMER">Disclaimer</md-button> </div> </footer> </div>
Legte ich den details der Appium-Rekorder über die Schaltfläche "login"
ich bin mit Jasmin-framework und nicht Mokka (chai) , ist, dass das, was du meinst ?
haben Sie versucht, die Antwort, die ich unten geschrieben?
Ja habe ich bereits versucht, aber problem ist nicht gelöst !
InformationsquelleAutor Emna | 2016-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möglicherweise gibt es mehrere Gründe, und es wird ein Ratespiel sowieso.
könnte es sein, dass es ein anderes element passenden
.login-button
locator und Sie klicken auf ein anderes element. Lassen Sie uns Verbesserung der locator:warten Sie, bis das element, das anklickbar:
hinzufügen kleine Verzögerung vor dem klicken auf das element (dumm, aber ich sehe, dass half manchmal):
anderen dummen versuchen, klicken Sie auf 2 mal, (ich kann nicht glauben, dass ich tatsächlich raten):
deaktivieren eckige Animationen
klicken Sie auf die Schaltfläche über
browser.Aktionen()
verschieben, um das element vor dem Klick:Art eine Erweiterung des bisherigen Ansatzes. Verschieben auf element schlafen für eine halbe Sekunde und klicken Sie dann auf:
Oder, wenn Sie die Einführung einer eigenen
sleep()
Aktion, die Sie tun können:klicken Sie auf das element über javascript:
Und, nachdem die form übermittelt wird, anstatt von
browser.sleep()
Sie können warten, bis die URL zu ändern, ausdrücklich finden:Als eine Randnotiz, Winkelmesser, verwenden Sie die
$
und$$
Verknüpfungen für die CSS-locators:okay, wie wäre es
element(by.css(".login-form .login-button"))
? Auch, wie über die option #2 - das warten - muss es spielen, um mit warten schön? Danke.mit element(durch.css(".login-Formular .login-button")) ist es ok, das element ist, fand ich sogar den text und drucken Sie es gleich auf "LOGIN" aber das problem der click () - nicht gelöst, doch mit all diesen smart-Optionen, die Sie vorschlagen, zu mir, die Aktion wird ausgeführt, aber wir sehen es nicht ! und mit diese option : den browser.Aktionen.mouseMove(loginButton).klicken Sie auf().ausführen(); ich habe diesen Fehler browser.Aktionen.mouseMove ist nicht definiert. Sonst bekam ich diese Fehlermeldung nach dem Ende der Skript-Ausführung : - Fehler: Timeout - Asynchrone callback wurde nicht aufgerufen, innerhalb von timeout angegeben, die von Jasmin.DEFAULT_TIMEOUT_INTERVAL
der "browser actions" die option ein problem hatte - nur Festnetz:
browser.actions().mouseMove(loginButton).click().perform()
.ja, ich habe gesehen, Sie begonnen haben, ein Kopfgeld auf diese Frage. Ich nehme einen genaueren Blick später, wenn ich eine chance haben. Verrückte Tage.., danke.
InformationsquelleAutor alecxe
Probieren Sie die Ausführung dieser Befehle, ohne mit dem Versprechen Kette. Es kann ein problem in der vorherigen Kette.
PS: Sie können vermeiden, mit den 'dann' - Funktion, wenn Sie nicht brauchen, um über das Ergebnis der Methode. Es wird gesteuert durch die Ablaufsteuerung
Ja, Sie könnte verwenden xpath-locator (nicht empfohlen). Ist Ihre Schaltfläche standardmäßig aktiviert oder füllen Sie ein paar Felder, um es zu aktivieren? Können Sie fügen Sie ein
browser.sleep(10000);
bevor Sie den Befehl auf und prüfen Sie den button anklicken? Funktioniert es? PS: versuchen Sie es mit '.md-angehoben login-button' zu finden, das element.ja, ich habe versucht mit der xpath generiert appium, aber es konnte nicht gefunden werden !! Ich legte die details des appium-recorder in Frage, weil ich bin testign mit appium und Winkelmesser
Ist Ihre Schaltfläche standardmäßig aktiviert oder es wird aktiviert durch ein Ereignis? Versuchen Sie, die Auslösung der mouseUp-Ereignis manuell nach dem ausfüllen der Passwort-Feld:
element(by.model('credentials.password')).sendKeys('RET02'); browser.actions().mouseDown().mouseUp().perform(); element(by.css('.login-button')).click();
.Vielen Dank für dein Kommentar, ja es ist standardmäßig aktiviert. jetzt klappt es mit einem Ding wie diesem einen browser.Aktionen().mouseMove(loginButton).klicken Sie auf().ausführen(); Aber ich weiß nicht, ob dies die beste Lösung für end-to-end-Prüfung oder sollte ich noch eine finden?
InformationsquelleAutor flaviomeira10
Nur hinzufügen browser.Schlaf nach dem Klick für mich gearbeitet:
InformationsquelleAutor evgpisarchik
Ich habe noch ein Vorschlag, Sie können erwarten, dass bestimmte Elemente angezeigt werden sollen, und deaktivieren Sie die text-box. Können Sie eigentlich schreiben, im Versprechen, dass der beste Weg.
dies ist die einzigartige Antwort unter anderen Antwort, bitte können einige auf mir sagen, warum dieser nach unten gestimmt.
Wie ich bereits erwähnt habe, können Sie vermeiden, das Versprechen die Verkettung, wenn Sie brauchen nicht das Ergebnis des Treiber-Befehl. Dein code ist nicht sehr leserlich. Werfen Sie einen Blick auf die Ablaufsteuerung Erklärung (spin.atomicobject.com/2014/12/17/...).
Hi @Nick, danke für den Versuch, die Antwort auf meine Frage Nick, aber die Methode wait (EG.elementToBeClickable () .. hat bereits vorgeschlagen Alecxe und es hat nicht funktioniert für mich.
versuchen Sie, löschen Sie text-Bereich und die Nutzung der Tastaturbefehle.
InformationsquelleAutor Nick