2013-04-09 48 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'));