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

以下のメソッドを使用して、インデックスを使用してフレームに切り替えることができます。Web ページに存在する最初のフレームに切り替えるには、以下のメソッドを使用できます。

 public function switchToIFrame($index = 0) {

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

                                              }
于 2013-04-09T14:27:44.250 に答える