Как переключиться на iframe с динамическим именем с помощью Behat/Mink

Написание теста для iFrame, сгенерированного при нажатии кнопки. Имя и идентификатор iFrame похожи, но генерируются динамически. Раньше я успешно использовал «switchToiFrame».

<div class="bbbb-frame-container" style="height: 400px; width: 665px; margin-top: -200px; margin-left: -332.5px;">
<div class="user-support-frame-close-container" style="display: block;">
<div class="user-support-frame-close">Close</div>
</div>
<iframe id="poplock_default9636_priv" frameborder="0" name="poplock_default9636_priv" src="blah.blaag.com">
<!DOCTYPE html>

.....................

poplock_defaultNNNN_priv — это динамически сгенерированный iFrame, на который я хотел бы переключиться.


person Ian Jenkins    schedule 08.05.2013    source источник


Ответы (4)


Сначала найдите iframe с помощью одного из методов поиска. Если это единственный iframe на странице (или первый), используйте find() method. Если это не так, вам придется использовать findAll() и полагаться на порядок (поскольку нет отдельного атрибута, который вы могли бы искать).

Найдя свой iframe, вы можете использовать getAttribute, чтобы получить его имя, а затем используйте switchToIframe, чтобы... переключиться на iframe.

person Jakub Zalas    schedule 08.05.2013
comment
Просто упомяните, что ссылки на getAttribute и swithToIframe не работают :| Вот альтернативная ссылка: apigen .juzna.cz/doc/Бехат/Минк/ - person Samuel Vicent; 27.03.2017

Спасибо, Якуб Залас, вы вдохновили меня на тестирование кода Stripe PopUp, встроенного в iframe.

Просто для того, чтобы поделиться своим опытом тестирования всплывающего окна Stripe Payment:

$page = $this->getSession()->getPage();
$this->getSession()->getDriver()->switchToIFrame('stripe_checkout_app');
$page = $this->getSession()->getPage();

/** @var NodeElement $stripeInputField */
$stripeInputField = $page->findField($field); // where $field can be: 'Email, CVC, Card Number, MM / YY'
$emailInput->setValue($value);

// Switch Back to Main Window
$this->getSession()->getDriver()->switchToIFrame(null);
person Samuel Vicent    schedule 27.03.2017
comment
Спасибо, что поделились этим кодом! Кстати, мне пришлось добавить параметр --disable-site-isolation-trials для браузера Chrome, иначе он все равно не хотел заполнять форму Stripe в iframe. - person Victor Bocharsky; 08.04.2021

Для тех, кому это может помочь, для поиска динамического имени iframe я использую селектор CSS по известному префиксу:

// Switch to the payment iframe.
$iframe = $this->getSession()->getPage()->find('css', 'iframe[name^="__privateStripeFrame"]');
$iframe_name = $iframe->getAttribute('name');
$this->getSession()->switchToIFrame($iframe_name);

Селектор CSS ^= относится к "начинается с..." - вместо этого вы можете использовать *= для "содержит...", если это не префикс.

Этот пример предназначен для получения всплывающего окна Stripe 3D Secure.

person baikho    schedule 27.09.2019

Если вам нужно просто манипулировать iFrame, см. этот вопрос. Ответы, например, представляют Javascript для получения первого iFrame, чтобы вы могли им манипулировать:

window.frames[0].document.body.<your action here>

Они также дают примеры jQuery для произвольных iFrames:

<iframe id="my_iframe" ...></iframe>
$('#my_iframe').contents().find('html').html();

Хотя это не совсем то, о чем вы просили, вы можете изменить их, чтобы найти n-й iFrame, если вы знаете количество сгенерированных iFrame и которыми хотите манипулировать, и затем манипулируйте им по мере необходимости.

person Dylan Knowles    schedule 07.08.2015