【问题标题】:Google fonts are not rendering in PhantomJSGoogle 字体未在 PhantomJS 中呈现
【发布时间】:2015-12-01 20:32:20
【问题描述】:

我正在使用 PhantomJS 来捕获网页。该页面具有来自 google fonts API 的字体。当我渲染页面时,字体不会被渲染并返回默认值。

PhantomJS 版本:2.0
平台:Windows

我添加了我使用的代码:

var page = require('webpage').create();
var args = require('system').args;

var isLoad = false;

page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36';

page.viewportSize = { width: 1400, height: 569.1588 };

page.open('http://www.facegift.co.il/canvas/print.aspx?userItemId=27477&Sc=974088&pagenum=3&width=1500&print=2', function (status) {
setTimeout(function () {
    var ue = page.evaluate(function () {
        return window.navigator.appVersion;
    });
    console.log("status: " + status);
    console.log("ue: " + ue);

    if (status === "success") {

        var timer = setInterval(function () {
            var ps = page.evaluate(function () {
                document.body.bgColor = 'white';
                return document.getElementById("pageStatus").innerHTML;
            });


            if (!isLoad) {
                console.log("wait...");
                if (ps == "loaded") {
                    clearInterval(timer);
                    console.log("proccessing...");
                    console.log("loaded");
                    isLoad = true;
                    page.render('new/exam1.png');
                    phantom.exit();
                }
            }
        }, 10);
    } else {
        console.log('Unable to load the address!');
        phantom.exit(1);
    }
}, 1500);
});

【问题讨论】:

  • 尝试过等待字体加载完毕?
  • 是的,超过 10 秒。但不好
  • 您的代码相当复杂。您是否尝试过逐个减少它,直到问题不再出现?此外,即使您有 1.5 秒的初始延迟,您以后的检查(如果页面需要更长的时间来加载)也是每秒 100 次,并在页面加载后立即拍摄图像(这不会给字体时间)。您最好等待页面完全加载 - 等待字体加载有多种技巧。此外,您应该考虑 innerHTML 永远不会“加载”的情况,即您应该有一个最大超时时间。
  • 好的,我这样做了,我发现设置 usetAgent 是问题,但是当我不设置它时,我又回到了它不旋转的其他问题。

标签: javascript fonts phantomjs google-font-api


【解决方案1】:

我无法重现您的问题。字体通常是在页面加载完成后加载的,所以需要等到字体加载完毕,页面重新渲染后,才能截图。我不知道加载和应用字体时可能触发的事件,但我在您的页面上的测试表明,等待 1.5 秒对于 PhantomJS 2.0.0 就足够了:

var page = require('webpage').create();

page.viewportSize = { width: 600, height: 600 };

page.open('http://www.facegift.co.il/canvas/print.aspx?userItemId=27477&Sc=974088&pagenum=3&width=1500&print=2', function(){
    setTimeout(function(){
        page.render("test40.png");
        phantom.exit();
    }, 1500);
});

【讨论】:

  • 嘿,出于某种原因,当我使用你的例子时。有效! ..但是当我在我的代码中使用它时,我没有。我将我的代码添加到问题中。你能告诉我我在那里做错了什么吗?
  • 它不会被触发,因为它仅在每张图片加载后检查'if (ps == "loaded")' 未设置为在页面启动时加载。在那个例子中我没有任何图片,这就是它加载速度快的原因。
  • 我现在看到了,但是您没有提供几乎足够的信息来诊断您的问题。 PhantomJS 脚本显然是不够的。这似乎是您的页面(JavaScript/CSS/媒体查询)的问题。请阅读Something in my web site or project doesn't work. Can I just paste a link to it?
  • 我已经复制了准确​​的脚本代码,包括 Facegift 的链接,但在我的屏幕截图中,我看到的是 Times,而不是我在网页上看到的“Gochi Hand”。将超时时间增加到 15 秒无济于事。使用 PhantomJS 2.1.1。
猜你喜欢
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 2014-03-27
  • 2018-04-03
  • 2015-03-28
  • 1970-01-01
相关资源
最近更新 更多