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

Posted

技术标签:

【中文标题】如何使用 Behat/Mink 切换到动态命名的 iframe【英文标题】:How to switch to dynamically named iframe with Behat/Mink 【发布时间】:2013-05-02 23:39:33 【问题描述】:

为单击按钮时生成的 iFrame 编写测试。 iFrame 名称和 id 相似,但动态生成。我之前已经成功使用过“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..

【问题讨论】:

【参考方案1】:

首先,找到具有find methods 之一的 iframe。如果它是页面上唯一的 iframe(或第一个),请使用 find() method。如果不是,您将不得不使用 findAll() 并依赖于顺序(因为没有可以搜索的不同属性)。

找到您的 iframe 后,您可以使用 getAttribute 获取其名称,然后使用 switchToIframe 来...好吧,切换到 iframe。

【讨论】:

只是提到 getAttribute 和 swithToIframe 的链接不起作用:|这里是一个替代链接:apigen.juzna.cz/doc/Behat/Mink/…【参考方案2】:

感谢 Jakub Zalas,您启发了我测试嵌入到 iframe 中的 Stripe PopUp 代码。

只是为了分享我测试 Stripe Payment PopUp 的经验:

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

【讨论】:

感谢分享此代码!顺便说一句,我必须为 Chrome 浏览器添加“--disable-site-isolation-trials”选项,否则,它仍然不想在 iframe 中填写 Stripe 的表单。【参考方案3】:

对谁有帮助,查找动态命名的 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 弹出窗口。

【讨论】:

【参考方案4】:

如果您需要简单地操作 iFrame,请参阅this question。例如,答案显示 javascript 以获取第一个 iFrame,以便您可以对其进行操作:

window.frames[0].document.body.&lt;your action here&gt;

他们还为任意 iFrame 提供了 jQuery 示例:

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

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

【讨论】:

以上是关于如何使用 Behat/Mink 切换到动态命名的 iframe的主要内容,如果未能解决你的问题,请参考以下文章

php Behat + Mink等待模态可见

php Behat + Mink等待模态可见

如何使用 XPath 获取特定表格单元格中的值

批处理怎么保存文件到动态命名文件夹

如何在 Kubernetes 中切换命名空间

Python Selenium:如何等待并切换到动态 iframe?