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”条件并没有找到任何有效的解决方案。