首页 > 解决方案 > 为什么条件代码没有在 CodeceptJS 中执行?

问题描述

CodeceptJS - 我需要选中一个复选框,前提是它还没有被选中。

我创建了一个辅助方法来检查条件,它返回正确的值,但是 if 语句中的代码没有被执行。

助手类/方法:

class CommonHelper {
    async clickIfPresent(elementToCheck, elementToClick, conditionCheck){
        try {
          const numVisible =  await I.grabNumberOfVisibleElements(elementToCheck);
          console.info('grab numVisible - ', numVisible, ', conditionCheck - ', conditionCheck);
          if (numVisible === conditionCheck) {
              console.info('elementToClick inside if - ', elementToClick);        
              I.click(elementToClick);
              I.wait(2);
      }
    } catch (err) {
      console.log('Skipping operation as element is not visible');
    }
}

module.exports = new CommonHelper();

方法调用:

Class EnableCheckbox {
const checkboxState = '//mat-checkbox[@formcontrolname="chkBxEnabled"]//input[@aria-checked="true"]';
const checkboxTag = '//mat-checkbox[@formcontrolname="chkBxEnabled"]';

enableCheckboxIfPresent(){
    commonHelper.clickIfPresent(checkboxState, checkboxTag, 0);
    I.seeElement(checkboxState);
  }
}   

我在 if 语句中看到了 step.before、step.after 的代码,但它没有被执行:

Emitted | step.start (I grab number of visible elements "//mat-checkbox[@formcontrolname="chkBxEnabled"]//input[@aria-checked="true"]")
  CommonHelper: clickIfPresent 
    I grab number of visible elements "//mat-checkbox[@formcontrolname="chkBxEnabled"]//input[@aria-checked="true"]"
Emitted | step.passed (I grab number of visible elements "//mat-checkbox[@formcontrolname="chkBxEnabled"]//input[@aria-checked="true"]")
Emitted | step.finish (I grab number of visible elements "//mat-checkbox[@formcontrolname="chkBxEnabled"]//input[@aria-checked="true"]")
grab numVisible -  0 , conditionCheck -  0
elementToClick inside if -  //mat-checkbox[@formcontrolname="chkBxEnabled"]
Emitted | step.before (I click "//mat-checkbox[@formcontrolname="chkBxEnabled"]")
Emitted | step.after (I click "//mat-checkbox[@formcontrolname="chkBxEnabled"]")
Emitted | step.before (I wait 2)
Emitted | step.after (I wait 2)
Emitted | step.start (I see element "//mat-checkbox[@formcontrolname="chkBxEnabled"]//input[@aria-checked="true"]")
  EnableCheckbox: enableCheckboxIfPresent 
    I see element "//mat-checkbox[@formcontrolname="chkBxEnabled"]//input[@aria-checked="true"]"
    › [SmartWait (20000ms)] Locating //mat-checkbox[@formcontrolname="chkBxEnabled"]//input[@aria-checked="true"] in 20000
[1] Error | Error: Element "//mat-checkbox[@formcontrolname="chkBxEnabled"]//input[@aria-checked="true"]" was not found by text|CSS|XPath
Emitted | step.failed (I see element "//mat-checkbox[@formcontrolname="chkBxEnabled"]//input[@aria-checked="true"]")
Emitted | step.finish (I see element "//mat-checkbox[@formcontrolname="chkBxEnabled"]//input[@aria-checked="true"]")

我在这里错过了什么吗?或者有没有其他方法可以做到这一点?蒂亚!

标签: codeceptjs

解决方案


if 语句中的代码正在执行。您可以在日志中看到它:elementToClick inside if - //mat-checkbox[@formcontrolname="chkBxEnabled"]

里面I的方法不执行。

没有Iin 助手。如果您查看自定义帮助文档,则其中没有I使用。

而不是它使用this.helpers.<helper name with method>.<method>,例如this.helpers.WebDriver.wait(2)

作为替代。也许(未经测试),const {I} = inject();在帮助文件的开头会帮助你。


推荐阅读