Двойной щелчок Cypress или щелчок ввод действия не вызывают изменения DOM, как ожидалось

#cypress

Вопрос:

Я должен ввести значение во входные данные, которые отображаются в DOM только при двойном щелчке мыши. Тем не менее, я пытался дважды щелкнуть, щелкнуть и ввести ввод, в большинстве случаев это не удается (кажется, что он дважды щелкает, но затем выходит из него вместо того, чтобы оставаться в состоянии изображения № 2, поэтому ввод отсутствует, и я не могу ввести это новое значение.

Перед двойным щелчком

 <div tabindex="-1" unselectable="on" role="gridcell" aria-colindex="4" comp-id="331" col-id="averageRate" class="ag-cell ag-cell-auto-height ag-right-aligned-cell ag-cell-value ag-cell-focus ag-cell-not-inline-editing" style="width: 168px; left: 504px;">
   <msc-basic-cell-renderer _nghost-mnn-c205="">
     <div _ngcontent-mnn-c205="" class="cell-renderer-wrapper">
       <span _ngcontent-mnn-c205=""> 0.799387 </span>
       <!----><!----><!---->
     </div>
  </msc-basic-cell-renderer>
</div>
 

После двойного щелчка вручную (или нажатия клавиши ввод)

 <div tabindex="-1" unselectable="on" role="gridcell" aria-colindex="4" comp-id="331" col-id="averageRate" class="ag-cell ag-cell-auto-height ag-right-aligned-cell ag-cell-value ag-cell-focus ag-column-hover ag-cell-inline-editing" style="width: 168px; left: 504px;">
   <msc-numeric-input _nghost-mnn-c217="">
       <div _ngcontent-mnn-c217="" class="numeric-cell msc-h100 w-100 ng-touched ng-pristine ng-valid">
          <input _ngcontent-mnn-c217="" type="number" placeholder="Value" class="numeric-input msc-h100 w-100 ng-touched ng-pristine ng-valid focus-visible" data-focus-visible-added="">
       </div><!----> 
    </msc-numeric-input>
</div>
 

До
до

После
после

Вот код, который работает большую часть времени. Мне пришлось добавить жестко закодированные ожидания и обойти правила компоновки:

 cy.wait(5000);

cy.get(`.mfc-dialog-overlay div[ref="eCenterContainer"] div[col-id="${field}"]`).click();
cy.wait(1000);
cy.get('.mfc-dialog-overlay div[ref="eCenterContainer"] div.ag-cell-focus')
      .as('cell').type('1');
cy.wait(1000);
cy.get('@cell').invoke('html').then(innerHtml => {
      if (innerHtml.includes('msc-basic-cell-renderer')) {
              cy.wait(1000);
              cy.get('@cell').type('1');
        }
});
cy.wait(1000).get(`msc-numeric-input input`, { timeout: 5000 }).type(value);
cy.get(this.HEADER_ON_RATES_POPOVER).click();
 

Я также попробовал dblclick({force: true}), нажмите (), а затем введите(‘{enter}’) безрезультатно… в лучшем случае он работает с перерывами, но большую часть времени не работает.

Комментарии:

1. пожалуйста, поделитесь кодом, который вы пробовали ?

2. Пожалуйста, добавьте свой код cypress, и мы сделаем все возможное

3. Вот код, который работает большую часть времени. Мне пришлось добавить жестко закодированные ожидания и обойти правила компоновки:

Ответ №1:

Судя по изображениям, у вас есть ag-сетка, которая может быть медленной и требовать дополнительных параметров тайм-аута для команд (а не фиксированных cy.wait() вызовов).

Существует пара классов ag-cell-not-inline-editing , ag-cell-inline-editing которые совпадают с двумя состояниями ячеек, показанными на ваших изображениях.

Они полезны для того, чтобы убедиться, что у вас правильное состояние.

Простейший тест с ванильной ag-сеткой

 cy.get('[row-id="0"]', {timeout: 10000}).within(() => {    // first row

  const field = 'lastName'

  cy.get(`div[col-id="${field}"]`)
    .should('have.class', 'ag-cell-not-inline-editing')  // confirm not editing
  
  cy.get(`div[col-id="${field}"]`)
    .type('Johnson')                                // .type() automatically gives focus
    .should('have.class', 'ag-cell-inline-editing') // confirm entered editing state

  cy.get(`div[col-id="${field}"]`)
    .type('{enter}')                         // close editing state

  cy.get(`div[col-id="${field}"]`)
    .should('have.class', 'ag-cell-not-inline-editing')  // confirm not editing
    .and('have.text', 'Johnson')                       // confirm text
})
 

В ячейках есть дополнительный слой ( <msc-numeric-input> ), который может вызвать проблемы с выбором времени. Я не могу идентифицировать его для непосредственного тестирования, но, возможно, это компонент веб-сборки.

В любом случае, выбор времени можно решить, дождавшись появления входных данных (которые вы, похоже, уже определили).

В ожидании <input>

 cy.get('[row-id="0"]', {timeout: 10000}).within(() => {

  const field = 'lastName'

  cy.get(`div[col-id="${field}"]`)
    .should('have.class', 'ag-cell-not-inline-editing')

  cy.get(`div[col-id="${field}"]`)
    .dblclick()                                      // trigger editing mode
    .should('have.class', 'ag-cell-inline-editing')  // confirm editing mode
    .find('input', {timeout: 10000})                 // confirm input appears
    .type('Johnson')

  cy.get(`div[col-id="${field}"]`)
    .type('{enter}')                                // exit editing mode

  cy.get(`div[col-id="${field}"]`)
    .should('have.class', 'ag-cell-not-inline-editing')
    .and('have.text', 'Johnson')

})
 

Также можно выйти из режима редактирования, щелкнув в стороне от ячейки, например

 cy.get(`div[col-id="${field}"]`)       // exit editing mode
  .next().click()                      // instead of .type('{enter}')
 

или вкладки (которые автоматически вводят редактирование в следующей ячейке)

 cy.get(`div[col-id="${field}"]`)       // exit editing mode
  .trigger('keydown', { keyCode: 9 })  // instead of .type('{enter}')
 

Комментарии:

1. Это выглядит потрясающе. Попробую это на следующей неделе и дам вам знать, как все прошло! Большое спасибо!

2. Похоже, это должно сработать, но, к сожалению, это не так. Даже если добавить 5 секунд ожидания, прежде чем убедиться, что модал полностью загружен, что не работает, так это то, что этот div переходит к этапу редактирования. Попробовал щелкнуть и ввести dblclick, и, похоже, ничто не заставляет этот ввод отображаться программно. Он просто включается и выключается сразу же, когда я его смотрю, но не остается в режиме редактирования.