【问题标题】:Use CodeCeption assertion in conditional (if) statement在条件 (if) 语句中使用 CodeCeption 断言
【发布时间】: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

【问题讨论】:

    标签: php if-statement conditional assertion codeception


    【解决方案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://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;
            }
            

            【讨论】:

              【解决方案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”条件的任何可行解决方案。
              猜你喜欢
              • 2021-03-07
              • 1970-01-01
              • 1970-01-01
              • 2019-04-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-11-19
              • 1970-01-01
              相关资源
              最近更新 更多