Verwenden Sie die CodeCeption-Assertion in einer bedingten (if)-Anweisung

Lesezeit: 4 Minuten

Benutzer-Avatar
Borjovsky

Ich bin ganz neu bei CodeCeption.

Ich möchte eine Aktion/Behauptung in Abhängigkeit von einem anderen Behauptungsergebnis wie folgt ausführen:

if ($I->see('message')){

    $I->click('button_close');

}

Ist so etwas möglich? Ich habe es versucht, aber es funktioniert nicht. Wahrscheinlich gilt das Assertion-Ergebnis nicht für IF, aber gibt es eine Alternative?

Danke im Voraus!

WICHTIGE UPDATE:

Endlich hat Codeception nun die Funktion performOn!!
http://codeception.com/docs/modules/WebDriver#performOn

Ich hatte das gleiche Problem. Obwohl es nicht ideal ist, können Sie Folgendes tun:

try {
    $I->see('message');
    // Continue to do this if it's present
    // ...
} catch (Exception $e) {
    // Do this if it's not present.
    // ...
}

  • Groß!! Diese Lösung ist besser als meine! Viel flexibler und sieht besser aus. Ich wusste nicht, dass try/catch funktionieren könnte. Vielen Dank!

    – Borjovsky

    18. Dezember 2015 um 11:44 Uhr


  • nein! Beachten Sie Folgendes: Der Test wird nicht als fehlgeschlagen angezeigt, aber wenn Sie danach einen Fehler haben, wird möglicherweise eine zusätzliche Fehlerzeile hinzugefügt, die verwirrend sein kann. Aber wenn der Rest der Tests bestanden wird, wird es sich nicht beschweren.

    – DAB

    18. Dezember 2015 um 16:48 Uhr

  • Danke DAB! Ich schätze, ich werde solche Situationen mit dem Fang bewältigen können.

    – Borjovsky

    18. Dezember 2015 um 23:41 Uhr

  • Dies hat nichts für mich getan, meine Tests schlagen immer noch fehl, wenn das Element nicht vorhanden ist. Hat jemand Folgemaßnahmen?

    – Julie Pixie

    31. Dezember 2020 um 21:10 Uhr

Benutzer-Avatar
Matthias

Im tests/_support/AcceptanceHelper.php zusätzliche Methode hinzufügen

function seePageHasElement($element)
{
    try {
        $this->getModule('WebDriver')->_findElements($element);
    } catch (\PHPUnit_Framework_AssertionFailedError $f) {
        return false;
    }
    return true;
}

Verwenden Sie dann zum Testen in Ihrem Abnahmetest:

if ($I->seePageHasElement("input[name=address]")) {
    $I->fillField("input[name=address]", "IM");
}

Sie können eine Problemumgehung wie diese oder ähnliche Kombinationen verwenden:

$tmp = $I->grabTextFrom('SELECTOR');
if ($tmp == 'your text') {

$I->click('button_close');

}

  • Diese Idee ist in Ordnung, aber es gibt ein Problem: Wenn der ‘SELECTOR’ nicht vorhanden ist (keine ‘Nachricht’ in meinem Beispiel), schlägt die Assertion fehl und die Testsuite stoppt. Also eine Behauptung muss hängen von einer anderen Behauptung ab. Aber danke trotzdem!

    – Borjovsky

    12. November 2014 um 17:24 Uhr

Benutzer-Avatar
Borjovsky

ULTIMATIVE LÖSUNG!

Endlich hat Codeception nun die Funktion performOnder genau das tut, wonach ich gefragt habe !!

[Version 2.2.9]

http://codeception.com/docs/modules/WebDriver#performOn

Antwort auf mein Beispiel:

$I->performOn('.message', ['click' => '#button_close'], 30);

Wartet bis zu 30 Sekunden, bis das Element mit class=”message” angezeigt wird, und klickt dann auf das Element mit id=’button_close’.

Codeception hat jetzt tryTo...z.B, tryToSee() trytoClick()usw., sodass kein Try/Catch-Block erforderlich ist. Ich finde es besser lesbar als performOn().

Sie müssen es damit in accept.suite.yml oder codeception.yml aktivieren:

# enable conditional $I actions like $I->tryToSee()
step_decorators:
    - \Codeception\Step\TryTo
    - \Codeception\Step\ConditionalAssertion`

Sie können auf etwas klicken, das möglicherweise vorhanden ist oder nicht, mit:

$I->tryToClick('#save_button`);

Wenn keine Schaltfläche vorhanden ist, wird der Code ohne Fehlermeldung fortgesetzt. Dies könnte auch verwendet werden, um auf den Knoten zu klicken, um einen Abschnitt eines Baums zu erweitern, bevor Sie ihn untersuchen, aber nur wenn dieser Abschnitt geschlossen ist (es sollte immer eine Klasse geben, die nur da ist, wenn sie geschlossen ist).

Ein anderer Weg ist in ein if Aussage. Das tryTo... Methoden geben bei Erfolg alle true und bei Misserfolg false zurück, so dass Sie dies tun können, was manche für klarer halten als das oben Gesagte (es wird kein Fehler ausgegeben):

if ($I->tryToSee('some_locator')) {
    $I->click('some_locator');
}

Dieses Formular ist auch nützlich, wenn es eine Folge von Aktionen gibt, die Sie basierend auf einer Bedingung ausführen möchten else es ist optional.

if ($I->tryToSee('some_locator')) {
    $I->fillField('username', 'myname');
    $I->fillfield('password', 'mypassword);
    $I->click('Submit');
} else {
   /* Do something else */
}

Benutzer-Avatar
Programmieren Sie niemals alleine

Release für mein Projekt kommt am Wochenende

/**
 * https://stackoverflow.com/questions/26183792/use-codeception-assertion-in-conditional-if-statement
 * @param $element
 * @return bool
 * @throws \Codeception\Exception\ModuleException
 */
public function seePageHasElement($element)
{
    $findElement = $this->getModule('WebDriver')->_findElements($element);
    return count($findElement) > 0;
}

Benutzer-Avatar
EvgenyPok

Der Grund, warum die Assertion mit bedingten Anweisungen nicht funktioniert, ist, dass Codeception zuerst die Assertion innerhalb der IF-Klammern ausführt, und falls sie nicht wahr ist, der Test sofort fehlschlägt. Mein Weg, dies zu überwinden, besteht darin, die SOFT-Assertionen zu verwenden TryTo was von Codeception ignoriert wird, wenn es fehlschlägt: https://codeception.com/docs/08-Customization#Step-Decorators

if ($I->tryToSee('message')){

    $I->click('button_close');

}```

1056810cookie-checkVerwenden Sie die CodeCeption-Assertion in einer bedingten (if)-Anweisung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy