Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在条件(if)语句中使用CodeCeption断言_Php_If Statement_Conditional_Assertion_Codeception - Fatal编程技术网

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

Php 在条件(if)语句中使用CodeCeption断言,php,if-statement,conditional,assertion,codeception,Php,If Statement,Conditional,Assertion,Codeception,我是一个全新的认知者 我想根据另一个断言结果执行操作/断言,如下所示: if ($I->see('message')){ $I->click('button_close'); } 这样可能吗?我试过了,但没用。 断言结果可能不适用于IF,但是有其他选择吗 提前谢谢 重要更新: 最后,Codeception现在具有函数performOn!! 您可以使用如下或类似组合的解决方法: $tmp = $I->grabTextFrom('SELECTOR'); if ($tm

我是一个全新的认知者

我想根据另一个断言结果执行操作/断言,如下所示:

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

    $I->click('button_close');

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

提前谢谢

重要更新: 最后,Codeception现在具有函数
performOn
!!

您可以使用如下或类似组合的解决方法:

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

$I->click('button_close');

}

终极解决方案

最后,Codeception现在有了函数
performOn
,它完全符合我的要求

[版本2.2.9]

回答我的例子:

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

等待30秒以查看class='message'元素,然后单击id='button\u close'元素。

我也遇到了同样的问题。虽然这并不理想,但您可以这样做:

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

tests/\u support/AcceptanceHelper.php中
添加其他方法

function seePageHasElement($element)
{
    try {
        $this->getModule('WebDriver')->_findElements($element);
    } catch (\PHPUnit_Framework_AssertionFailedError $f) {
        return false;
    }
    return true;
}
public 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");
}
if ($I->seePageHasElement($element)) {
    $I->fillField($element);
}

100%工作解决方案!!(稍后再告诉我;)

在tests/\u support/AcceptanceHelper.php中添加其他方法

function seePageHasElement($element)
{
    try {
        $this->getModule('WebDriver')->_findElements($element);
    } catch (\PHPUnit_Framework_AssertionFailedError $f) {
        return false;
    }
    return true;
}
public 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");
}
if ($I->seePageHasElement($element)) {
    $I->fillField($element);
}

WebDriver的'seeElement'功能在本例中不起作用,因此只需对功能进行少量修改,因为我使用了一个'\u findElements'。请不要忘记在完成任何更改后构建参与者。

我的项目版本将于本周发布

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

断言不能与条件语句一起使用的原因是Codeception首先在IF括号内执行断言,如果断言不为true,则会立即失败测试。我克服这一问题的方法是使用软断言
TryTo
,如果失败,Codeception将忽略该断言:


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…< /Cord>方法所有的返回成功和失败的假,这样你就可以做到这一点,一些人可能会比上面更清楚(没有错误会被抛出):

如果您希望根据某个条件执行一系列操作,则此表单也很有用,
else
是可选的

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

这个想法很好,但有一个问题:如果“选择器”不存在(在我的示例中没有“消息”),则断言失败,测试套件停止。因此,一个断言必须依赖于另一个断言。不过还是要谢谢你!伟大的这个解决方案比我的好!更灵活,看起来更好。我不知道try/catch能起作用。非常感谢你!NP需要注意的一点是,它不会显示测试失败,但是如果在测试失败之后您确实出现了失败,那么它可能会添加一个额外的错误行,这可能会让您感到困惑。但如果其余的测试通过,它不会抱怨。谢谢!我想我可以用catch处理这种情况。这对我没有任何帮助,如果元素不存在,我的测试仍然失败。有人跟进吗?这并不能回答这个问题。一旦你有足够的钱,你将能够;相反“这不管用”是什么意思?你有错误吗?请具体点。@Naktibalda我是说“这不起作用”?解决方案对我不起作用,因为我有同样的案例。我找到了适合我的解决方案&我已经发布了它,以便有需要的人能从中受益。你的解决方案的一个问题是
\u findElements
不会抛出PHPUnit\u Framework\u断言失败错误异常当元素不存在时,它会返回一个空数组。@Naktibalda你是对的!!我提供了解决方案,以满足使用“IF”语句比较某个内容的需要,并在其为真时执行所需任务。在我的codeception代码中使用“IF”条件并没有找到任何有效的解决方案。