2013-05-08 35 views
2

爲單擊按鈕時生成的iFrame編寫測試。 iFrame的名稱和ID是相似的,但動態生成。我之前成功使用過「switchToiFrame」。如何使用Behat/Mink切換到動態命名的iframe

<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,我想切換到..

回答

8

首先,用find methods之一找到一個iframe。如果它是頁面上唯一的iframe(或第一個)使用find() method。如果不是,則必須使用findAll()並依賴訂單(因爲沒有可以搜索的獨特屬性)。

找到您的iframe後,您可以使用getAttribute來獲取它的名稱,然後使用switchToIframe ......以切換到iframe。

+0

只是提到他鏈接的getAttribute和swithToIframe不工作:| 這裏您是替代的鏈接:http://apigen.juzna.cz/doc/Behat/Mink/class-Behat.Mink.Driver.DriverInterface.html#_switchToIFrame – 2017-03-27 08:35:33

0

如果您需要簡單地操作iFrame,請參閱this question。這些問題的答案,例如,目前的Javascript,以獲得第一的iFrame這樣你就可以對其進行操作:

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

他們也給jQuery的例子對任意的iFrame:

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

雖然這些不完全如果您知道生成的iFrames的數量以及您想要操作的iFrame的數量,然後根據需要對其進行處理,您可以將它們更改爲查找第n個iFrame。

1

謝謝Jakub Zalas您啓發了我測試嵌入到iframe中的Stripe 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);