#iframe #codeceptjs
#iframe #codeceptjs
Вопрос:
Я использую CodeceptJS и пытаюсь написать пользовательский помощник, который утверждает текст и нажимает «ОК». Это диалоговое окно появляется как модальный iframe для согласия с файлами cookie.
Если я напишу следующие шаги в своем сценарии
I.amOnPage('/some-path');
within({frame: '#iframeID'}, () => {
I.see('Headline text for dialog');
I.click('OK');
});
// ...
… мой тест, похоже, работает просто отлично.
Но когда я создаю из этого пользовательский помощник и правильно его настраиваю, чтобы я мог его использовать:
const { Helper } = codeceptjs;
class CookieConsent extends Helper {
consentWithCookies() {
const { Puppeteer } = this.helpers;
within({frame: '#iframeID'}, () => {
Puppeteer.see('Headline text for dialog');
Puppeteer.click('OK');
});
}
}
module.exports = CookieConsent;
… и используйте это как шаг:
I.amOnPage('/some-path');
I.consentWithCookies();
// ...
… похоже, это не работает, поскольку диалоговое окно согласия не удаляется, как это было при реализации этого непосредственно в сценарии. Согласно некоторой console.log()
отладке, обратный вызов внутри вообще не вызывается. Консоль не выдает никаких ошибок о undefined within
или о чем-либо подозрительном.
Я подозреваю, что использование within
в пользовательском помощнике не работает, или я делаю что-то не так, что я не могу понять из документации.
Это предупреждение в документации на самом деле не проясняет, когда within используется неправильно, и использование await
не помогает решить проблему.
внутри может вызвать проблемы при неправильном использовании. Если вы видите странное поведение теста, попробуйте реорганизовать его, чтобы не использовать внутри. Рекомендуется придерживаться простейших случаев, когда это возможно. Поскольку within возвращает обещание, может потребоваться дождаться результата, даже если вы не собираетесь использовать возвращаемое значение.
Ответ №1:
Без iFrames может быть сложно работать, когда дело доходит до автоматизации. Существует ряд факторов, которые могут сделать iFrame недоступным для фреймворка, такого как междоменные фреймы IFRAME, обычно используемые для повышения безопасности обслуживаемого контента.
Теперь, чтобы устранить вашу проблему, все, что вам нужно сделать, это использовать switchTo()
— Docs в CodeceptJS, который является функцией, доступной для всех доступных помощников. Порядок должен быть
I.switchTo('your iframe');
..... some actions here;
I.switchTo(); // You do this so that you get out of the iFrame context when done