2013-04-09 29 views
1

我想用PHPUnit Selenium選擇一個iframe,但不知怎的,它似乎不工作。這是代碼:PHPUnit - Selenium 2:如何選擇沒有ID和名稱的iframe?

<body> 
... 
<div id="container"> 
<iframe src="x.html"> 
    <html> 
    ... 
    <body></body> <!-- this is the body I would like to get --> 
    ... 
    </html> 
</iframe> 
</div> 
... 
</body> 

而且PHP:

<?php 
class Test extends PHPUnit_Extensions_Selenium2TestCase { 

    public function testIframe() { 

     $theFrame = $this->byCssSelector('#container iframe'); 

     $this->frame($theFrame->getId()); 

     $this->byCssSelector('body')->text('test'); 

    } 
} 

如果我檢查$ theFrame變量,它與ID = 5的PHPUnit_Extensions_Selenium2TestCase_Element,但不知何故$這個 - >框架($ theFrame-> getId())會拋出一個錯誤:

PHPUnit_Extensions_Selenium2TestCase_WebDriverException: Unable to locate frame: 5 
Command duration or timeout: 32 milliseconds 
Build info: version: '2.31.0', revision: '1bd294d', time: '2013-02-27 20:52:59' 
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '3.2.0-39-generic',   
java.version: '1.7.0_17' 
Session ID: 0192c3aa-d4a2-4c9d-bcca-bbd7139dd8c3 
Driver info: org.openqa.selenium.firefox.FirefoxDriver 
Capabilities [{platform=LINUX, databaseEnabled=true, cssSelectorsEnabled=true,  
javascriptEnabled=true, acceptSslCerts=true, handlesAlerts=true, browserName=firefox,  
browserConnectionEnabled=true, nativeEvents=false, webStorageEnabled=true, 
rotatable=false, locationContextEnabled=true, applicationCacheEnabled=true,  
takesScreenshot=true, version=20.0}] 

你知道爲什麼嗎?

回答

-1

您可以使用下面的方法使用它的索引切換到一個幀。要切換到網頁中的第一幀,我們可以使用下面的方法。

public function switchToIFrame($index = 0) { 

          $this->session->getDriver()->switchToIFrame($index); 

               } 
+0

我得到一個錯誤:PHP致命錯誤:調用一個成員函數getDriver()一個非對象 - 恍如session不存在 – rochadk 2013-04-09 16:18:53

+0

我不是PHP。基本上我來自Java背景。在Java中有一個名爲driver.switchTo()。frame(0)的函數;'希望在PHP中應該有一個等價的方法。我從Google獲得了上述解決方案。 – Hemanth 2013-04-09 16:24:57

+0

好的,我猜測等效函數將是$ this-> frame($ index),但這也不起作用。感謝您的幫助:) – rochadk 2013-04-10 05:08:48

2

給iframe一些id或名稱並使用下面的代碼,它將起作用。

$this->frame('id/name'); 
$this->byCssSelector('body')->text('test'); 

如果有多個iframe,然後分配null值,並開始按照層次獲取(父 - >兒童安全>等)有同樣的問題

$this->frame(null); 
$this->frame('parentFrame'); 
$this->frame('childFrame'); 
0

,和我的解決辦法是執行一個JavaScript,它將迭代所有iframe標記,然後通過其現有屬性確定要定位的iframe,然後將您自己的屬性設置爲唯一標識符。

$this->execute(array(
     'script' => " 
      var myiFrames = document.getElementsByTagName('iframe'); 
      for(var i=0; i<=myiFrames.length; i++) 
      { 
       //determine iframe by src which may contain 'test' str 
       if(myiFrames[i].getAttribute('src').search('test')>=0){ 
        myiFrames[i].setAttribute('myCustomId', 'myTargetFrame') 
       } 
      }", 
     'args' => array() 
    )); 

,那麼你現在可以指定你的XPath IFRAME ...

$myframe = $this->byXPath("//*[@myCustomId='myTargetFrame']"); 
$this->frame($frame->attribute('id')); 
相關問題