在条件 (if) 语句中使用 CodeCeption 断言
Posted
技术标签:
【中文标题】在条件 (if) 语句中使用 CodeCeption 断言【英文标题】:Use CodeCeption assertion in conditional (if) statement 【发布时间】:2014-11-28 19:09:07 【问题描述】:我是 CodeCeption 的新手。
我想根据另一个断言结果执行操作/断言,如下所示:
if ($I->see('message'))
$I->click('button_close');
这样的事情可能吗?我试过了,但没有用。 可能断言结果不适用于 IF,但有什么替代方案吗?
提前致谢!
重要更新:
Codeception 现在终于有了函数performOn
!!
http://codeception.com/docs/modules/WebDriver#performOn
【问题讨论】:
【参考方案1】:我也有同样的问题。虽然不理想,但您可以这样做:
try
$I->see('message');
// Continue to do this if it's present
// ...
catch (Exception $e)
// Do this if it's not present.
// ...
【讨论】:
太棒了!!这个解决方案比我的好!更灵活,看起来更好。我不知道 try/catch 可以工作。非常感谢! np!需要注意的一件事 - 它不会将测试显示为失败,但如果在此之后确实失败了,它可能会添加一个额外的错误行,这可能会造成混淆。但如果其余测试通过,它就不会抱怨。 感谢民建联!我想我可以用 catch 处理这种情况。 这对我没有任何作用,如果元素不存在,我的测试仍然会失败。有人有后续吗?【参考方案2】:在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");
【讨论】:
【参考方案3】:您可以使用类似的解决方法或类似的组合:
$tmp = $I->grabTextFrom('SELECTOR');
if ($tmp == 'your text')
$I->click('button_close');
【讨论】:
这个想法很好,但是有一个问题:如果“SELECTOR”不存在(在我的示例中没有“消息”),则断言失败并且测试套件停止。因此,一个断言必须依赖于另一个断言。不过还是谢谢你!【参考方案4】:终极解决方案!
Codeception 现在终于有了 performOn
功能,这正是我所要求的!
[版本 2.2.9]
http://codeception.com/docs/modules/WebDriver#performOn
回答我的例子:
$I->performOn('.message', ['click' => '#button_close'], 30);
最多等待 30 秒以查看 class='message' 的元素,然后单击 id='button_close' 的元素。
【讨论】:
【参考方案5】:断言不适用于条件语句的原因是 Codeception 首先在 IF 括号内执行断言,如果它不正确 - 它会立即使测试失败。我克服这个问题的方法是使用 SOFT 断言 TryTo
,如果失败,它将被 Codeception 忽略:https://codeception.com/docs/08-Customization#Step-Decorators
if ($I->tryToSee('message'))
$I->click('button_close');
```
【讨论】:
【参考方案6】: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】:我的项目将于周末发布
/**
* https://***.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;
【讨论】:
【参考方案8】: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' ,因此几乎不需要修改功能。请不要忘记构建您的演员完成任何更改后。
【讨论】:
这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review “这不起作用”是什么意思?你有错误吗?请具体。 @Naktibalda 我的意思是“这不起作用”?是该解决方案对我不起作用,因为我有同样的情况。我找到了适合我的正确解决方案,我已经发布了它,以便有需要的人受益。 你的解决方案的一个问题是_findElements
在元素不存在时不会抛出PHPUnit_Framework_AssertionFailedError异常,它返回一个空数组。
@Naktibalda 没错!那部分没有处理。我提供了解决方案来满足使用“IF”语句来比较某些东西并在其为真时执行所需任务的需求。而且我没有找到在我的代码接收代码中使用“IF”条件的任何可行解决方案。以上是关于在条件 (if) 语句中使用 CodeCeption 断言的主要内容,如果未能解决你的问题,请参考以下文章