1

我正在尝试使用 PHPUnit Selenium 选择一个 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,但不知何故 $this->frame($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}]

你知道为什么吗?

4

3 回答 3

2

为 iframe 提供一些 id 或名称并使用以下代码,它将起作用。

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

如果有多个 iframe,则分配值 null 并开始根据层次结构(父->子->等等)获取

$this->frame(null);
$this->frame('parentFrame');
$this->frame('childFrame');
于 2013-07-01T14:52:50.747 回答
0

有同样的问题,我的解决方法是执行一个将迭代所有 iframe 标记的 javascript,然后通过其现有属性确定要定位的 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'));
于 2015-04-23T06:08:27.760 回答
-1

您可以使用下面的方法使用它的索引切换到一个框架。要切换到网页中存在的第一帧,我们可以使用以下方法。

 public function switchToIFrame($index = 0) {

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

                                              }
于 2013-04-09T14:27:44.250 回答