Как обрабатывать отдельные элементы при использовании Cypress для поисковых испытаний? - PullRequest
0 голосов
/ 01 апреля 2020

Я создал скрипт Cypress для тестирования большого исследовательского сайта, что означает, что он будет анализировать все ссылки и элементы и взаимодействовать со всеми ними в поисках неожиданных JavaScript - или исключений сервера (примечание стороны). : я не могу найти примеры этого онлайн?). Он проходит по всему сайту, щелкая как сумасшедший, что работает довольно хорошо. Однако время от времени тесты останавливаются на страшном «CypressError: cy.click () не удалось, потому что этот элемент отсоединен от DOM».

Cypress requires elements be attached in the DOM to interact with them.

The previous command that ran was:

  cy.wrap()

This DOM element likely became detached somewhere between the previous and current command.

Я понимаю, что это происходит, когда скрипт взаимодействует с состояние анимации и переключения страниц, и сценарий может пропустить все эти отдельные элементы и продолжить его выполнение, однако мне не удается найти способ игнорировать ошибку. Вы можете подумать, что достаточно проверить помощников кипарисов, но они, похоже, не справляются с этой задачей (см. Ниже). Я попытался использовать большие значения для cy.wait (), но по какой-то причине он все еще не перехватывает отдельные элементы, даже если все манипуляции с страницами из последнего взаимодействия завершены.

Обратите внимание, что wrap работает, но не щелчок.

        if (Cypress.dom.isVisible(element[0]) && !Cypress.dom.isDetached(element[0])) {
            cy.wrap(element[0])
                // .scrollIntoView()
                .click({ force: true })
                .then(() => cy.wait(100));
        }

Я не хочу проглотить все неожиданные ошибки, так как они могут быть значимыми ... Здесь нет идей.


РЕДАКТИРОВАТЬ

Вот еще мой код, ведущий к cy.wrap (). Как видите, довольно просто заимствовать очевидные javascript и ошибки сервера:

clickAllElements = () => {
    this.getAllClickableElements().each(this.clickElement); //running it twice to toggle state
    this.getAllClickableElements().each(this.clickElement);
};

getClickableElementsSelector = () => "button:visible, a:visible[href='javascript:;'], a:visible[href='#'], a:visible[href='javascript:void(null)'], a:not([href])";
getAllClickableElements = () => cy.get(this.getClickableElementsSelector()).not(".disabled");

clickElement = (element) => {
    if (Cypress.dom.isVisible(element[0]) && !Cypress.dom.isDetached(element[0])) {
        this.checkMainError();

        cy.wrap(element[0]) // i tried cy.get here as well to re-get the element, but with the same detached error on click
            // .scrollIntoView() //ideally i'd like to have scrollIntoView here as well, but that won't work with hidden elements (as click({force}) does)
            .click({ force: true })
            .then(() => cy.wait(100));
    }
}

Вот снимок экрана бегуна, пробующего cy.get вместо cy.wrap. Результат идентичен для cy.wrap: Cypress-runner

...