我对CodeCeption完全不满意。
我想根据另一个断言结果做一个动作/断言,如下所示:
if ($I->see('message')){
$I->click('button_close');
}
这样的事情可能吗?我试过了,但没办法。 可能断言结果不适用于IF,但有其他选择吗?
提前致谢!
最后,Codeception现在具有 performOn
功能!!
http://codeception.com/docs/modules/WebDriver#performOn
答案 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'。请不要忘记建立你的演员完成任何更改后。