Использование `внутри` в пользовательских помощниках

Я использую 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() отладкам, внутренний обратный вызов вообще не вызывается. Консоль не выдает ошибок о неопределенном within или о чем-либо подозрительном.

Я подозреваю, что использование within в пользовательском помощнике не работает или я делаю что-то не так, что не могу понять из документации.

Это предупреждение в документации на самом деле не поясняет, когда внутри используется неправильно, а при использовании await не не помочь в проблеме.

внутри может вызвать проблемы при неправильном использовании. Если вы видите странное поведение теста, попробуйте его рефакторинг, чтобы он не использовался внутри. По возможности рекомендуется для простейших случаев укладываться в рамки. Поскольку внутри возвращает обещание, может потребоваться дождаться результата, даже если вы не собираетесь использовать возвращаемое значение.


person Miksu    schedule 12.10.2020    source источник


Ответы (1)


Когда дело доходит до автоматизации, без iFrames может быть сложно работать. Существует ряд факторов, которые могут сделать iFrame недоступным для инфраструктуры, такой как междоменные iFrames, обычно используемые для повышения безопасности обслуживаемого контента.

Теперь, чтобы решить вашу проблему, все, что вам нужно сделать, это использовать switchTo() - Документы в CodeceptJS, которые это функция, доступная для всех доступных помощников. Порядок должен быть

I.switchTo('your iframe');
..... some actions here;
I.switchTo(); // You do this so that you get out of the iFrame context when done
person user3628567    schedule 13.10.2020