PhantomJS问题打开动态重命名的帧

时间:2014-05-26 21:13:31

标签: javascript phantomjs

我正在尝试遍历iframe树,但遇到了PhantomJS的特定问题。

我正在使用本地托管的网页,其中包含最基本的iframe示例。

<div>
frame 0
</div>
<iframe name="1-1" width="500px;height: 500px;" src="frame-1-1.html"></iframe>

这是我通过PhantomJS运行的Javascript代码。

page.open(url,function(status){

var test = page.evaluate(function(){
    var iframes = document.getElementsByTagName('iframe');
    var frames = document.getElementsByTagName('frame');

    if(iframes.length >0)
    {
        iframes.item(0).name = 'test1';
        return iframes.item(0).name;
    }
    else if(frames.length > 0)
    {
        frames.item(0).name = 'test2';
        return frames.item(0).name;
    }
    return "replaced nothing";

});

fs.write('test.txt', page.content, "w");

console.log("test: " + test);
page.switchToFrame(test);
var test2 = page.evaluate(function()
{
    return document.getElementsByName('test1')[0].name;
});
console.log(test2);
console.log("||||" + page.frameName);
 });

test.txt示例输出文件包含预期的内容。 &#34; 1-1&#34;替换为&#34; test1&#34;在HTML代码中。

变量 test 包含值&#34; test1&#34;正如预期的那样

变量 test2 包含值&#34; test1&#34;正如预期的那样

但是, page.switchToFrame(test) 不符合预期的范围。如果在此处运行 page.switchToFrame("1-1") ,页面将切换,忽略之前对DOM的更改。

反过来,使用当前代码, page.frameName 不包含任何值,因为框架未切换到内部iframe。

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

我找到了解决此问题的解决方法。

内部:

if(iframes.length >0)
{
    iframes.item(0).name = 'test1';
    return iframes.item(0).name;
}

else if(frames.length > 0)
{
    frames.item(0).name = 'test2';
    return frames.item(0).name;
}

如果在返回之前添加:

var outhtml = iframes.item(0).outerHTML;

iframes.item(0).outerHTML = outhtml;

它在PhantomJS中强制进行某种更新,以排除问题。最后的page.frameName具有正确的值“test1”,test2变量包含预期的NULL值