Phantomjs / Casper 不会在 <iframe> 中渲染 <embed>

Phantomjs / Casper won't render <embed> inside an <iframe>

我正在进行这项测试,我必须在其中获取 pdf 文件的内容。 html 结构(在传统浏览器的客户端呈现后)是这样的

<iframe id="frame" name="frame" src="a link" id="frame" >
   <embed id="plugin" src="src to pdf file">
        pdf shows up here
   </embed
</iframe>

当我在 casper 上输出 html 时,iframe 内容是空的,我的代码是这样的

casper.then(function(){
    this.wait(5000);
    casper.withFrame('frame', function(){
       //the page renders whell but it won't show the pdf
       this.capture('pic.png');
       this.evaluate(function(){
           //finds
           document.querySelector('body');
           //returns null
           document.querySelector('embed');
       });
    });
);

我不明白为什么 phantom 不使用 pdf 文件渲染元素,有解决方法吗?

很难给你一个深入的答案,因为你没有提供Minimal, Complete, and Verifiable example。但是,我可以建议您几件事来解决您的问题:

1。修复语法错误

您的代码中存在一些语法错误,尤其是当您使用 evaluate 时。回调未正确传递,您没有 return 任何值。要测试 evaluate 结果,您通常必须执行以下操作:

this.echo('Title: ' + this.evaluate(function () {
  return document.title;
}));

2。使用 getHTML() 检查 <embed> 是否存在

withFrame 中,您可以使用以下行打印 <iframe> 的原始 HTML 代码:

console.log(this.getHTML());

这就是 CasperJS 实际看到的。

3。测试这个脚本并仔细分析输出

var casper = require('casper').create();

casper.start('URL OF YOUR MAIN PAGE');

casper.then(function () {
  this.echo('Main page: ' + this.getTitle());
  this.wait(5000).withFrame('frame', function () {
    this.echo('iframe: ' + this.evaluate(function () {
      return document.title;
    }));
    this.capture('pic.png');
    console.log(this.getHTML());
  });
});

casper.run();