在条件(if)语句中使用CodeCeption断言

时间:2014-10-03 17:28:08

标签: php if-statement conditional assertion codeception

我对CodeCeption完全不满意。

我想根据另一个断言结果做一个动作/断言,如下所示:

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

    $I->click('button_close');

}

这样的事情可能吗?我试过了,但没办法。 可能断言结果不适用于IF,但有其他选择吗?

提前致谢!

重要更新:

最后,Codeception现在具有 performOn 功能!! http://codeception.com/docs/modules/WebDriver#performOn

8 个答案:

答案 0 :(得分:15)

我有同样的问题。虽然它不理想,但你可以这样做:

2

答案 1 :(得分:8)

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");
}

然后在验收测试中使用测试:

{{1}}

答案 2 :(得分:2)

您可以使用此类或类似组合的变通方法:

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

$I->click('button_close');

}

答案 3 :(得分:1)

终极解决方案!

最后,Codeception现在具有 performOn 功能,这正是我要求的!

[Version 2.2.9]

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

回答我的例子:

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

最多等待30秒才能看到带有class =' message'的元素,然后点击ID =' button_close'的元素。

答案 4 :(得分:0)

我的项目每星期发布一次

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

答案 5 :(得分:0)

断言不适用于条件语句的原因是 Codeception 首先执行 IF 括号内的断言,如果它不正确 - 它立即无法通过测试。我克服这个问题的方法是使用软断言 TryTo,如果失败,Codeception 将忽略该断言:https://codeception.com/docs/08-Customization#Step-Decorators

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

    $I->click('button_close');

}```

答案 6 :(得分:0)

Codeception 现在有 tryTo...,例如 tryToSee() trytoClick() 等,因此不需要 Try/Catch 块。我发现它比 performOn() 更具可读性。

您需要在acceptance.suite.yml 或codeception.yml 中启用它:

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

您可以点击可能存在或不存在的内容:

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

如果没有按钮,代码会继续运行,没有错误消息。这也可以用于在检查之前单击节点以展开树的一部分,但如果该部分已关闭(应该始终有一个仅在关闭时才存在的类)。

另一种方法是使用 if 语句。 tryTo... 方法在成功时都返回 true,在失败时返回 false,所以你可以这样做,有些人可能认为这比上面的更清晰(不会抛出错误):

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

如果您想根据条件执行一系列操作,此表单也很有用,else 是可选的。

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

答案 7 :(得分:-1)

100%工作解决方案!!以后谢谢我;)

在tests / _support / AcceptanceHelper.php中添加其他方法

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

然后在验收测试中使用测试:

if ($I->seePageHasElement($element)) {
    $I->fillField($element);
}

WebDriver的'seeElement'功能在这种情况下不起作用所以需要很少的修改功能,因为我使用了一个'_ findElements'。请不要忘记建立你的演员完成任何更改后。