如何使用 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.<your action here>
他们还为任意 iFrame 提供了 jQuery 示例:
<iframe id="my_iframe" ...></iframe>
$('#my_iframe').contents().find('html').html();
虽然这些并不完全符合您的要求,但您可以更改它们以找到第 n 个 iFrame,如果您知道生成的 iFrame 的数量以及您想要的操纵,然后根据需要操纵它。
【讨论】:
以上是关于如何使用 Behat/Mink 切换到动态命名的 iframe的主要内容,如果未能解决你的问题,请参考以下文章