2014-12-26 2 views
6

Да, я это знаю. Функция привязки не поддерживается Phantomjs. Но, может быть, я могу использовать что-то еще или сказать page.open не использовать bind? Вроде бы хорошо, но некоторые сайты возвращают ошибкуPhantomjs Function.prototype.bind

TypeError: 'undefined' is not a function (evaluating 'b.bind(a)') 

После этого я написал простой скрипт, который только открывает страницу:

var address = phantom.args[0]; 
if(!address) phantom.exit(1); 

page = require("webpage").create(); 

page.open(address, function(status){ 
setInterval(
    function() { 

    console.log(
     page.evaluate(function() { 
      return document.body.innerHTML.length; 
     }) 
    )}, 200) 
}) 

Но ошибка все еще там. Ошибка не является основной проблемой, но проблема заключается в получении содержимого страницы, потому что после содержимого страницы с ошибкой не загружается ...

Итак, мне нужна помощь.

P.S. Веб-сайт проблемы http://vkrushelnytskiy.wix.com/aaaa

+0

Почему вы думаете, что страница будет загружаться, поскольку ничего не произошло, когда ошибка привязки возникает из 'require.min.js'? –

+1

Возможный дубликат [Phantomjs page.content не извлекает содержимое страницы] (http://stackoverflow.com/questions/26382041/phantomjs-page-content-isnt-retrieving-the-page-content) –

+0

^Я попробовал это с вашим URL-адресом, и это работает. –

ответ

1

Вы можете выполнить функцию Function.bind следующим образом: polyfill.

Просто добавьте его коду, который вы пытаетесь запустить. Есть, вероятно, более приятные решения, но это отлично подойдет для меня.

+1

Это не работает. Не спрашивай меня, почему. –

2
You can use this code as an alternative 

if (!Function.prototype.bind) { 
    Function.prototype.bind = function(oThis) { 
    if (typeof this !== 'function') { 
     // closest thing possible to the ECMAScript 5 
     // internal IsCallable function 
     throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); 
    } 

    var aArgs = Array.prototype.slice.call(arguments, 1), 
     fToBind = this, 
     fNOP = function() {}, 
     fBound = function() { 
      return fToBind.apply(this instanceof fNOP 
       ? this 
       : oThis, 
       aArgs.concat(Array.prototype.slice.call(arguments))); 
     }; 

    fNOP.prototype = this.prototype; 
    fBound.prototype = new fNOP(); 

    return fBound; 
    }; 
} 
1

Вы можете упомянуть эту функцию связывания непосредственно перед тестовым случаем.

// PhantomJS doesn't support bind yet 
Function.prototype.bind = Function.prototype.bind || 
    function (ctx) { 
    var fn = this, 
     args = [], 
     param_length = 0; 

    for(var i=0; i<arguments.length; i++) {  
    if(i){ 
     args[i-1] = arguments[i]; 
    } 
    } 
    param_length = args.length; 
    return function() { 
    for(var i =0; i<arguments.length; i++){ 
     args[param_length + i] = arguments[i]; 
    } 
    return fn.apply(ctx, args); 
    }; 
}; 
7

Существует npm package which loads a polyfill for phantomJS's missing .bind method. Копирование инструкций по установке здесь для удобства, но следуйте по ссылке для любых обновлений.

Установка

npm install --save-dev phantomjs-polyfill 

Использование

require('phantomjs-polyfill') 

Использование с кармой Включите polyfill непосредственно в списке файлов вашего karma.conf

... 
files: [ 
    './node_modules/phantomjs-polyfill/bind-polyfill.js', 
    ... 
] 
... 
Смежные вопросы