Phantomjs 抛出“此页面使用框架,但您的浏览器不支持它们”错误,即使在设置了正确的用户代理后也是如此

Phantomjs throwing "This page uses frames, but your browser doesn't support them" error even after setting the correct useragent

本文关键字:错误 设置 用户代理 不支持 抛出 框架 Phantomjs 浏览器      更新时间:2023-09-26

当我尝试使用phantomjs打开我们内部应用程序的一个网页(适用于IE8)时,"page.content"显示在html消息下方。但是,page.render("test.png")显示完全加载的页面。我已将page.settings.useragent设置为为什么.render()和.content之间存在差异?如何调试/解决此问题?

网页输出:

<html>
<frameset id="mainFrameSet" border="0" frameborder="yes" framespacing="1" rows="37px,*" topmargin="0" leftmargin="0" bordercolor="#cdcdcd">
    <frame name="header" src="<src>" frameborder="0" marginheight="0" bordercolor="#cdcdcd" marginwidth="0" noresize="" scrolling="no" bor
der="0">
    <frame frameborder="0" border="0" name="main" id="main" src="<src>" bordercolor="#cdcdcd" scrolling="auto" leftmargin="0">
    <noframes>
        &lt;BODY&gt;
        &lt;P&gt;This page uses frames, but your browser doesn't support them.&lt;/P&gt;
        &lt;/BODY&gt;
    </noframes>
</frameset>
</html>

我的代码:

var page = require("webpage").create(), testindex = 0, loadInProgress = false;
page.settings.javascriptEnabled = true;
page.settings.localToRemoteUrlAccessEnabled = true;
page.settings.XSSAuditingEnabled = true;
page.viewportSize = { width: 1366, height: 768 };
page.settings.userAgent = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)';
//Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US)
//Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)
//Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.8 Safari/534.34
//Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
//Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0)
//Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)
//SpecialAgent
    //Load Login Page
    page.open("<URL>");
    window.setTimeout(function(){
    enterLoginCredentials();
        },10000);
  function enterLoginCredentials (){
    //Enter Credentials
    page.evaluate(function() {
      console.log("Loading login page..:  " + url);
      var uName = document.getElementsByName("username");
      var uPass = document.getElementsByName("password");
      uName[0].value="username";
      uPass[0].value="password";
    });
    window.setTimeout(function(){
    clickLogin();
        },1000);
  }
  function clickLogin(){
    //Login
    page.evaluate(function() {
    var formSubmit = document.forms["loginForm"];
    formSubmit.submit();
    });
    window.setTimeout(function(){
    search();
        },10000);
    page.render("LRMLogin111.png");
  }
function search(){
    page.render("Homepage.png");
    console.log("Homepage "+page.content);
    phantom.exit();
}

即使在今天,有些页面也使用框架。与您选择的浏览器的开发人员工具相比,PhantomJS在主DOM中不包含子帧的DOM。例如,请参阅试图克服此问题的此问题:转储包含iframe的页面的HTML。

如果您真的想打印和操作子框架,则必须切换到它们。这通常是用 page.switchToFrame .若要获取内容,可以记录 page.frameContent 属性。

page.render("Homepage.png");
console.log(page.frameContent); // same as page.content here
console.log("############################################");
page.switchToFrame(0); // first child frame
console.log(page.frameContent); // different as page.content here
console.log("############################################");
page.switchToMainFrame(); // switch back up before switching to the second child
page.switchToFrame(1); // second child frame
console.log(page.frameContent); // different as page.content here
console.log("############################################");
page.switchToMainFrame();
console.log(page.frameContent); // same as page.content here