我正在尝试遍历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。
我错过了什么吗?
答案 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值