如何使用Behat/Mink切换到动态命名的iframe

如何使用Behat/Mink切换到动态命名的iframe,iframe,selenium-webdriver,behat,mink,Iframe,Selenium Webdriver,Behat,Mink,为单击按钮时生成的iFrame编写测试。iFrame名称和id类似,但是动态生成的。我以前成功地使用过“switchToiFrame” 接近 poplock_defaultNNNN_priv是动态生成的iFrame,我想切换到它。首先,找到一个包含以下内容之一的iFrame:。如果它是页面上唯一的iframe(或第一个iframe),请使用find()方法。如果不是,则必须使用findAll()并依赖顺序(因为没有可以搜索的明确属性) 找到iframe后,可以使用获取其名称,然后使用。。。

为单击按钮时生成的iFrame编写测试。iFrame名称和id类似,但是动态生成的。我以前成功地使用过“switchToiFrame”


接近


poplock_defaultNNNN_priv是动态生成的iFrame,我想切换到它。

首先,找到一个包含以下内容之一的iFrame:。如果它是页面上唯一的iframe(或第一个iframe),请使用
find()方法
。如果不是,则必须使用
findAll()
并依赖顺序(因为没有可以搜索的明确属性)


找到iframe后,可以使用获取其名称,然后使用。。。好吧,切换到iframe

如果需要简单地操作iFrame,请参见。例如,答案提供了获取第一个iFrame的Javascript,以便您可以对其进行操作:

window.frames[0].document.body.

它们还提供了任意iFrame的jQuery示例:

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

$('my#iframe').contents().find('html').html();

虽然这些并不完全是您所要求的,但是如果您知道生成的iFrame的数量以及您想要操作的iFrame的数量,您可以修改它们以找到第n个iFrame,然后根据需要进行操作。

谢谢Jakub Zalas您启发我测试嵌入到iFrame中的条带弹出代码

仅供分享我测试条带支付弹出窗口的经验:

$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);

对于可能有帮助的人,要查找动态命名的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安全弹出窗口。

只需提及到getAttribute和swithToIframe的链接不起作用:|这里是另一个链接:感谢共享此代码!顺便说一句,我必须为Chrome浏览器添加“--禁用站点隔离测试”选项,否则,它仍然不想在iframe中填写Stripe的表单。