Я создал скрипт 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: