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

27

我在使用CodeCeption方面完全是新手。

我想根据另一个断言的结果执行某个操作/断言,就像这样:

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

    $I->click('button_close');

}

类似这样的情况是否可能?我尝试过了,但没有效果。 也许断言结果不适用于IF语句,但是否有其他选择?

提前感谢!

重要更新:

最终,Codeception现在拥有函数performOnhttp://codeception.com/docs/modules/WebDriver#performOn

8个回答

22

我曾经遇到了同样的问题。虽然不是最理想的解决方法,但你可以这样做:

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

太好了!这个解决方案比我的好多了!更加灵活,看起来也更好。我不知道try/catch可以这样用。非常感谢! - Borjovsky
np!需要注意的一点是 - 它不会显示测试失败,但如果在此之后出现故障,则可能会添加一个额外的错误行,这可能会令人困惑。但如果其余测试通过,它就不会抱怨。 - DAB
谢谢DAB!我想我将能够通过catch处理这种情况。 - Borjovsky
这对我没有任何作用,如果元素不存在,我的测试仍然失败。有人有任何后续吗? - Julie Pixie
这个东西刚刚拯救了我头上稀疏的头发,遇到异常似乎是运行特定条件的唯一方法,例如我有一个页面,只有在按下按钮后才显示表单,尝试 $I->see 意味着我可以告诉测试去按下按钮(它并不总是可用的)。谢谢! - JimmyBorofan

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

4
您可以使用类似以下方法的解决方案或类似组合:
$tmp = $I->grabTextFrom('SELECTOR');
if ($tmp == 'your text') {

$I->click('button_close');

}

那个想法不错,但是有一个问题:如果“SELECTOR”不存在(例如在我的示例中没有“message”),断言会失败并且测试套件会停止。因此,一个断言必须依赖于另一个断言。但无论如何还是谢谢! - Borjovsky

3

终极解决方案!

最终,Codeception现在有了performOn函数,它正是我所期望的!

[版本2.2.9]

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

回答我的问题:

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

等待最多30秒钟以查看类为“message”的元素,然后单击具有id ='button_close'的元素。


2
现在,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 */
}

0

我的项目发布将在周末进行。

/**
 * https://dev59.com/wV8e5IYBdhLWcg3wAWns
 * @param $element
 * @return bool
 * @throws \Codeception\Exception\ModuleException
 */
public function seePageHasElement($element)
{
    $findElement = $this->getModule('WebDriver')->_findElements($element);
    return count($findElement) > 0;
}

0
断言与条件语句不兼容的原因是Codeception首先执行IF括号内的断言,如果它不成立,就会立即失败测试。我克服这个问题的方法是使用SOFT断言TryTo,如果失败,Codeception将忽略它:https://codeception.com/docs/08-Customization#Step-Decorators
if ($I->tryToSee('message')){

    $I->click('button_close');

}```

-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'。请不要忘记在进行任何更改后构建您的操作者。


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Naktibalda
你说的“This does not work”是什么意思?你是否收到了错误提示?请具体说明。 - Naktibalda
@Naktibalda 我所说的“This does not work”是指解决方案对我无效,因为我遇到了同样的情况。我找到了适合我的正确解决方案,并发布了它,以便需要的人可以受益。 - iamuser2
你的解决方案存在问题,就是当元素不存在时,_findElements 不会抛出 PHPUnit_Framework_AssertionFailedError 异常,而是返回一个空数组。 - Naktibalda
@Naktibalda 你说得对!!那部分没有被处理。我提供了解决方案,以满足使用“IF”语句比较某些内容并在其为真时执行所需任务的需求。但我在我的Codeception代码中没有找到任何可行的使用“IF”条件的解决方案。 - iamuser2
那是Matija的解决方案。 - Borjovsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接