Подтвердить что ты не робот

Использование PhantomJS для встраивания всех изображений веб-страницы создает предупреждения, но работает

Я пытаюсь преобразовать веб-страницу в один файл, вставив все изображения (и другие внешние ресурсы, как только я передал эту точку). Вот как я запускаю PhantomJs:

./phantomjs --web-security=false ./embed_images.js http://localhost/index.html > output.txt

И здесь embed_images.js:

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

if (system.args.length === 1) {
    console.log('Usage: embed_images.js <some URL>');
    phantom.exit(1);
}
else {
    page.onConsoleMessage = function(msg) {
        console.log(msg);
    };
    address = system.args[1];
    page.open(address, function(status) {
        page.evaluate(function() {
            function embedImg(org) {
                var img = new Image();
                img.src = org.src;
                img.onload = function() {
                    var canvas = document.createElement("canvas");
                    canvas.width = this.width;
                    canvas.height = this.height;

                    var ctx = canvas.getContext("2d");
                    ctx.drawImage(this, 0, 0);

                    var dataURL = canvas.toDataURL("image/png");

                    org.src = dataURL;
                    console.log(dataURL);
                }
            }
            var imgs = document.getElementsByTagName("img");
            for (var index=0; index < imgs.length; index++) {
                embedImg(imgs[index]);
            }
        });
        phantom.exit()
    });
}

Когда я запускаю указанную команду, она приводит к следующему файлу:

Unsafe JavaScript attempt to access frame with URL  from frame with URL file://./embed_images.js. Domains, protocols and ports must match.
Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL file://./embed_images.js. Domains, protocols and ports must match.

Несколько экземпляров вышеуказанного сообщения об ошибке. Чтобы проверить, что случилось, я запустил приведенный ниже код в консоли Chromium:

function embedImg(org) {
    var img = new Image();
    img.src = org.src;
    img.onload = function() {
        var canvas = document.createElement("canvas");
        canvas.width = this.width;
        canvas.height = this.height;

        var ctx = canvas.getContext("2d");
        ctx.drawImage(this, 0, 0);

        var dataURL = canvas.toDataURL("image/png");

        org.src = dataURL;
        console.log(dataURL);
    }
}
var imgs = document.getElementsByTagName("img");
for (var index=0; index < imgs.length; index++) {
    embedImg(imgs[index]);
}

И он отлично работает (моя веб-страница не ссылается на междоменные образы)! Он будет внедрять все изображения в HTML-страницу. Кто-нибудь знает, в чем проблема?

Здесь мой контент index.html:

<!DOCTYPE html >
<html>
<head>
<meta charset="utf-8" />
</head>

<body>
<img src="1.png" >
</body>
</html>

И фактический вывод (output.txt):

Unsafe JavaScript attempt to access frame with URL  from frame with URL file://./embed_images.js. Domains, protocols and ports must match.

Unsafe JavaScript attempt to access frame with URL  from frame with URL file://./embed_images.js. Domains, protocols and ports must match.

Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL file://./embed_images.js. Domains, protocols and ports must match.

Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL file://./embed_images.js. Domains, protocols and ports must match.

Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL file://./embed_images.js. Domains, protocols and ports must match.

Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL file://./embed_images.js. Domains, protocols and ports must match.

Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL file://./embed_images.js. Domains, protocols and ports must match.

Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL file://./embed_images.js. Domains, protocols and ports must match.

Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL file://./embed_images.js. Domains, protocols and ports must match.

Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL file://./embed_images.js. Domains, protocols and ports must match.

Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL file://./embed_images.js. Domains, protocols and ports must match.

Странно то, что пока у меня есть только одно изображение на моей странице, есть многочисленные сообщения об ошибках!

Я использую phantomjs-1.9.8-linux-x86_64.

4b9b3361

Ответ 1

Эти уведомления печатаются при вызове phantom.exit. Они не вызывают никаких проблем, но не очень приятны, когда вам нужен чистый выход PhantomJS. В вашем случае вы можете подавить уведомления путем "асинхронизации" phantom.exit следующим образом:

setTimeout(function(){
    phantom.exit();
}, 0);

Я думаю, причина в том, что это происходит потому, что большая строка передается из контекста страницы, когда phantom пытается выйти.

Я создал проблему github для этого.