赛普拉斯 select 项来自不断增长的列表 (q-select)

Cypress select item from growing list (q-select)

要进行一些测试,我需要为字段设置一个值。我在以最佳方式设置下拉列表时遇到了一些麻烦。其他套件似乎在带有下拉列表的套件完成之前就已经开始了。我正在遍历字段,每个字段都做了一个套件,特别是为了确保它们不是并行完成的。套件设置并检查字段。

droplist(quasar q-select)的情况是不知道有多少个选项,n个选项后,selection内容又增加了新的选项和旧的删除。这意味着如果您只是 select 包含所有选项的 div,如果您的价值在那个数量,它就会起作用。

现在我有一个下拉列表的自定义函数。每次按下向下箭头时,selection 都会向下移动,并在需要时将下一个选项添加到列表中。因此我一直需要获取内容。

Cypress.Commands.add('selectOption', (strOptionValue) => {
    function funcSelect (strOptionValue, iIndex) {
        cy.get('.q-select__options--content')
            .find('.q-item')
            .eq(iIndex)
            .then($oOption => {
                cy.wrap($oOption)
                    .find('[class=q-item__label]')
                    .then($oOptionLabel => {
                        const strListValue = $oOptionLabel.text();

                        cy.log('['+strOptionValue+']-['+strListValue+']');

                        if (strListValue === strOptionValue) {
                            cy.wrap($oOption)
                                .click();
                        } else {
                            cy.wrap($oOption)
                                .type('{downarrow}');

                            funcSelect(strOptionValue, iIndex + 1);
                        }
                    });
            });
    }

    funcSelect(strOptionValue, 0);
});

我认为不对的地方:使用索引。列表中的金额没有变化,现在它一直在检查整个列表。我认为应该可以做到:

  1. 循环列表
  2. 如果在最后一个没有找到,请点击下方
  3. 获取列表,
  4. 从第 2 步中获取项目
  5. 检查下一个
  6. 重复直到最后一个等等

有什么想法吗?

编辑: 还有两个额外的挑战: 一种。开始有时在项目总数的中间。向下箭头,在最后一个项目移动到第一个。这没关系,但这意味着您也需要在您最初开始的项目上进行突破。 b. 'arrowdown' 与单击的作用相同,它 select 是项目。我仍在检查,但在单击实际值之前继续测试循环可能会导致问题

我认为递归函数是正确的,但它需要 break-out 守卫来阻止无限递归。

然后我将获取 Cypress 当前可以选择的所有现有选项标签(即加载到 DOM)并查看搜索值是否在列表中。

由于列表每次递归都会更改,因此我会 re-query if/else 中的选项而不是换行。

最后,我会将递归调用链接到 .then() 中,因为 .type('{downarrow}') 发生在赛普拉斯命令队列上,您只想在该步骤完成后转到下一个调用。如果项目是从 API.

中获取的,您可能还想使用一个小的等待或使用一个拦截等待
function selectOption(searchForValue, attempt = 0) {

  if (attempt > 10 ) throw 'Too many attempts - item not found';

  cy.get('.q-select__options--content')
    .find('[class=q-item__label]')
    .then($labels => {
      const listValues = [...$labels].map(label => label.innerText)
      if (listValues.includes(searchForValue) {

        cy.contains('.q-select__options--content .q-item', searchForValue)
          .click()

      } else {

        cy.contains('.q-select__options--content .q-item', searchForValue)
          .type('{downarrow}')
          .then(() => {
            cy.wait(100) // or wait on an intercept alias if API involved
            selectOption(searchForValue, attempt + 1)
          })
      }
    })
}

selectOption(searchForValue);

顺便说一句,我认为 funcstr 前缀在 1996 年正式弃用了 ;).


克服向下箭头的问题

根据您对 down-arrow 的评论,我在“标准”类星体 select 上试用了 1000 个项目。

有些 selector 需要调整,但原理有效。

function selectOption(searchValue, attempt = 0) {

  if (attempt > 100 ) throw 'Too many attempts - item not found';

  cy.get('.q-item__label')
    .then($labels => {
      const listValues = [...$labels].map(label => label.innerText)

      if (listValues.includes(searchValue)) {
        cy.contains('.q-item__label', searchValue).click()
      } else {

        const lastItem = listValues[listValues.length -1]
        cy.contains('.q-item__label', lastItem)
          .type('{downarrow}')
          .then(() => {
            selectOption(searchValue, attempt + 1)  // next batch
          })
      }
    })
}

const searchValue = '500'

cy.get('.q-field__append').click();         // open dropdown

selectOption(searchValue);                  // find value

cy.get('.q-field__control-container span')  // confirm value
  .should('have.text', searchValue)         // passes ✅