通过Codeceptjs和Puppeteer迭代表行是否需要帮助器

问题描述

我正在尝试使用Codeceptjs中可用的方法来简单地迭代表的行,并基于要迭代的当前行的特定单元格中存在的文本来选择行。

以下代码在我的页面对象之一中,并且部分起作用。

async selectSiteById(siteId) {
    I.waitForElement('table');
    for (let i = 1; i < 5; i++) {
      let val = await I.grabTextFrom(`tbody tr:nth-child(${i}) td:nth-child(2)`);
      if (val === siteId) {
        I.say('Val' + val + ' -- Site Id ' + siteId)
        within(`tbody tr:nth-child(${i + 1}) td:nth-child(1)`,() => {
          I.click('input');
        });
      }
      break;
    }
  },

grabTextFrom会拉回我需要的确切值,并将其存储到val。

如果我传入的参数的值恰好在表的第一行中,则此方法有效。但是,无论我做什么,我的代码似乎都只能排在第一行,我也不知道为什么?

再次,如果第一行具有传入的参数值,那么my方法将触发并检查第一列中的输入框,确切地说是我希望的操作。

因此,我用于识别给定行中所要查找的文本的两段代码(多数情况下)有效,并且单击“该”行中的复选框的代码也有效。

如果有人可以帮助我理解为什么我不能让它遍历表的所有行,我将不胜感激。

而且,我似乎无法让codeceptjs将tbody中tr的总数作为一个简单的数组拉回,因此我可以将其用作循环的长度,因此任何指针都很棒。

为此,我尝试了-let rowCount = await I.grabNumberOfVisibleElements('tbody tr');,但似乎没有用。

我确实尝试将分手级别提高到一个水平,因为我最初以为是错误的位置。当我这样做时,运行测试会导致以下错误。

沙箱可在其中玩耍-勾选所有 对象:登录 我在页面“ /登录”上 我填写“ #username”,“ [email protected]”字段 我填写“ #password”字段,***** 我点击“登录” 我抓饼干 我单击“ li [id =“ resources.admin.name”]“ 我点击“站点” 我等待元素“表” 我从“ tbody tr:nth-​​child(1)td:nth-​​child(2)”中抓取文本√OK在7254ms内

tableFragment: selectSiteById
  I grab text from "tbody tr:nth-child(2) td:nth-child(2)"
  I grab text from "tbody tr:nth-child(3) td:nth-child(2)"   × "after all" hook: codeceptjs.afterSuite for "Check box of specific

表行”在4672ms中TypeError:无法读取null的属性“ $$” (节点:24032)UnhandledPromiseRejectionWarning:无法读取属性 '$$'为null(节点:24032)UnhandledPromiseRejectionWarning:未处理 承诺拒绝。该错误是由以下原因引起的: 一个没有catch块的异步函数,或者通过拒绝一个Promise 没有使用.catch()处理。终止节点进程 未处理的承诺被拒绝,请使用CLI标志 --unhandled-rejections=strict(请参阅 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝ID:7)(节点:24032)[DEP0018] DeprecationWarning:未处理 答应拒绝已弃用。将来,承诺会被拒绝 未处理的将终止Node.js进程 非零退出代码。

-故障:

  1. 可在其中玩耍的沙盒 “毕竟”钩子:codeceptjs.afterSuite用于“特定表行的复选框”: 无法读取null的属性“ $$”

使用--verbose标志运行以查看NodeJS stacktrace

最后,对于与表的基本交互,使用codeceptjs时,您基本上是否需要使用帮助程序,然后使用本机Puppeteer编写代码? (我在项目中使用人偶)

>>>>> 更新

谁能帮助我理解为什么您似乎无法使用CodeceptJS迭代表的行?我必须丢失一些东西。这是我当前来自PageObject类的代码,我不知道第一次迭代成功完成了什么,但是随后失败了。

async test() {
    const totalRows = await I.grabAttributeFrom('tbody tr');
    I.say('Total Rows: ' + totalRows.length);
    for (let i = 1; i < totalRows.length; i++) {
      I.say('Current row is: ' + i);
      let str = await I.grabTextFrom(
        `tbody tr:nth-child(${i}) td:nth-child(2)`,);
      I.say('String value from table is: ' + str);
      if (str === 'IDR') {
        I.say('Match found in row: ' + i);
        within(`tbody tr:nth-child(1) td:nth-child(1) span span`,() => {
          I.click('input');
        });
        break;
      }
    }
    // I.say('Hello');
    //   let scores = [10,15,20,30];
    //   for (let score of scores) {
    //     score += 3;
    //     I.say(score);
    //   }
  },

输出

要在其中使用的沙盒-选中表ALL 对象:登录 我在页面“ /登录”上 我填写“ #username”,“ [email protected]”字段 我填写“ #password”字段,***** 我点击“登录” 我抓饼干 我单击“ li [id =“ resources.admin.name”]“ 我点击“站点” 我从“ tbody tr”中获取属性 我在12226毫秒内等待5√OK

总行数:4当前行是:1 sitesPage:测试 我从“ tbody tr:nth-​​child(1)td:nth-​​child(2)”中抓取文本,表中的字符串值为:IDH当前行为:2 我从“ tbody tr:nth-​​child(2)td:nth-​​child(2)”ד毕竟”钩子中获取文本:codeceptjs.afterSuite中的“ More goofing around” 4682ms TypeError:无法读取null的属性'$$'(node:7180) UnhandledPromiseRejectionWarning:无法读取null的属性“ $$” (节点:7180)UnhandledPromiseRejectionWarning:未处理的承诺 拒绝。该错误是由抛出异步内部引起的 没有捕获块或拒绝承诺 未使用.catch()处理。终止未处理的节点进程 承诺拒绝,请使用CLI标志--unhandled-rejections=strict (请参见https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝ID:7)(节点:7180)[DEP0018] DeprecationWarning:未处理 答应拒绝已弃用。将来,承诺会被拒绝 未处理的将终止Node.js进程 非零退出代码。

-故障:

  1. 可在其中玩耍的沙盒 “毕竟”钩子:codeceptjs.afterSuite提供了“更多的愚弄”功能: 无法读取null的属性“ $$”

使用--verbose标志运行以查看NodeJS stacktrace

谢谢! 鲍勃

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)