нажатие кнопки подменю надежно работает только в тестовом бегуне

#javascript #cypress #ui-automation

#javascript #cypress #пользовательский интерфейс-автоматизация

Вопрос:

Я постоянно получаю сбой (тест проходит, отправка, полученная в результате шага щелчка, не является более точной), запускаемый из CLI (безголовый или нет) для нажатия кнопки, которая работает из Cypress UI / Test Runner (./node_modules/.bin/ cypress open). Элемент представляет собой кнопку, которая доступна после нажатия начальной кнопки сохранения. Когда я запускаю из CLI, я вижу, что кнопка выделена, но щелчок, который отправит страницу, не происходит. В пользовательском интерфейсе Cypress тот же код приводит к успешной отправке клика и страницы. Код:

 saveOrder() {
    cy.get('button[data-test="saveOrderButton"]').eq(0).click();
    cy.wait(5000);
    cy.get('button').contains('Save and View').click({ force: true, delay: 10000, timeout: 330000 });
}
  

Я попытался добавить дополнительные ожидания после второго щелчка. Я пробовал .dblclick(). Также попробовал щелчок jQuery, который я нашел в другом месте:

     cy.get('button').contains('Save and View').then(option => {
    cy.wrap(option).contains('Save and View');
    option[0].click();
})
  

Наконец, также пытались добавить .trigger(‘mouseover’) или .trigger(‘mousemove’). Ни одно из этих усилий не позволило тесту работать (нажатие кнопки) при запуске из CLI. Любые предложения будут оценены.

это то, что происходит вместо щелчка (кнопка выделена, но не нажата для отправки).

вот DOM

РЕДАКТИРОВАТЬ — я получал случайные успехи CLI, используя следующий код, но все еще очень ненадежный. Результаты тестового бегуна продолжают передаваться каждый раз. Я думал, что проблема, похоже, связана с условием гонки, обсуждаемым на https://www.cypress.io/blog/2019/01/22/when-can-the-test-click amp; возможно, я неправильно внедрил сторонний плагин, но у меня все еще очень слабый тест со следующим:

    saveOrder() {
        cy.get('button[data-test="saveOrderButton"]').eq(0).click({ force: true, delay: 600, timeout: 330000 });
        cy.wait(5000);

        let count = 0
        const clickSaveView = $el => {
            count  = 1
            return $el.click()
        }

        cy.contains('button', 'Save and View').eq(0)
            .should('be.visible')
            .wait(35000)
            .pipe(clickSaveView)
            .wait(5000)
            .should($el => {
                expect($el).to.not.be.visible
            })
            .then(() => {
                cy.log(`clicked ${count} times`)
            })
    }
  

Когда он проходит, я вижу записи в журнале, что он щелкнул 5 раз или 9 раз или сколько угодно. Когда это в основном не удается, я вижу, что элемент все еще был виден, и отправка щелчка не произошла (ошибка «AssertionError: ожидается ‘выпадающий список-пункт> «не должно быть «видимым»»). Разумно ли полагать, что Test Runner может так легко ожидать подключения слушателей, в то время как приложение при запуске Cypress из CLI работает невероятно медленнее? Существует ли какой-то необъявленный предел попыток нажатия (или, опять же, я, возможно, неправильно реализовал .pipe (click))? Я пробовал разбрызгивать ожидания на каждом этапе пути (что, как я думал, cypress-pipe устранит необходимость), но до сих пор не нашел хорошего решения.

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

1. Можете ли вы показать, какую ошибку выдает вам безголовый запуск? Также я предлагаю вам попробовать npx cypress run —браузер chrome — безголовый

2. Тест пройден, кнопка просто не нажата. Я добавил npx к вызову CLI, но получил тот же результат. npx ./node_modules/.bin/cypress run —браузер chrome —spec «cypress/integration/my_tests/new_order_entry_tests.js »

3. Я бы посоветовал попробовать .should(‘be.visible’).click() вместо ожидания перед щелчком, поскольку он выглядит так, как будто это зависит от рендеринга dome после первого щелчка, и время ожидания ответа API не может быть 100%. У меня были случаи, когда первый щелчок вызывает изменение состояния и обновление dome, а второй щелчок происходит до перезагрузки dome. происходит перезагрузка. Если это так — я бы поставил на первую button .click().should(‘not.be.visible’) и на вторую button .should(‘be.visible’).click()

4. спасибо за предложения. Я добавил ссылку на изображение ситуации. команды для нажатия выполняются успешно, но отправка страницы не происходит. Я добавил .should(‘be.visible’).click(), который вы предложили, но видите тот же результат. (первая кнопка останется видимой, как на изображении, поэтому не добавляла, что она не должна быть видна для нее). для меня вызывает недоумение то, что он выполняется успешно при запуске из пользовательского интерфейса Cypress, но не через какие-либо попытки CLI. Я также обновился до последней версии браузера Chrome.

5. Кажется возможным, что элемент не является кнопкой. Попробуйте использовать cy.contains(‘Сохранить и просмотреть’).should(‘be.visible’).click() или, если это кнопка cy.contains(‘кнопка’, ‘Сохранить и просмотреть’).should(‘быть.visible’).click()