web-dev-qa-db-ja.com

条件付き(if)ステートメントでCodeCeptionアサーションを使用する

私はCodeCeptionをまったく使用していません。

次のような別のアサーション結果に応じて、アクション/アサーションを実行したいと思います。

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

    $I->click('button_close');

}

そのようなことは可能ですか?試しましたが、うまくいきません。おそらくアサーションの結果はIFには適用されませんが、代替手段はありますか?

前もって感謝します!

重要な更新:

最後に、Codeceptionには関数performOnがあります!! http://codeception.com/docs/modules/WebDriver#performOn

21
Borjovsky

私はこれと同じ問題を抱えていました。理想的ではありませんが、次のことができます。

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

tests/_support/AcceptanceHelper.phpメソッドを追加

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

次に、受け入れテストでテストするには、次のようにします。

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

このような回避策または同様の組み合わせを使用できます。

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

$I->click('button_close');

}
3
Wonderas

究極のソリューション!

最後に、Codeceptionには関数performOnがあり、これは私が要求したことを正確に実行します!!

[バージョン2.2.9]

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

私の例に答える:

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

Class = 'message'の要素が表示されるまで最大30秒待機してから、id = 'button_close'の要素をクリックします。

2
Borjovsky

私のプロジェクトのリリースは毎週行われます

/**
 * 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;
}
0