Внедрение полифилла javascript на страницу с помощью Selenium и PhantomJS

Здесь и в других местах было много дискуссий об отсутствии в PhantomJS метода Function.prototype.bind, и многие полезные филантропы написали shims/polyfills или указали другим на эти ресурсы. Я реализую PhantomJS через Selenium Webdriver с привязками Python. Я пробовал несколько способов использовать этот полифилл, но безрезультатно. В настоящее время я использую следующий код в своем классе тестера, наследующем веб-драйвер:

    bindShim = """var script = document.createElement('script');
    script.src = '/home/dunkin/scripts/es5-shim.js';***
    script.type = 'text/javascript';
    document.getElementsByTagName('head')[0].appendChild(script);
    """
    self.execute_script(bindShim)

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

[ERROR - 2015-02-10T17:43:44.068Z] Session [fd37e5c0-b14b-11e4-b9e3-5bbebfaf3f9d] - page.onError - msg: TypeError: 'undefined' is not a function (evaluating 'arguments.callee.bind(this,e)')
[ERROR - 2015-02-10T17:43:44.069Z] Session [fd37e5c0-b14b-11e4-b9e3-5bbebfaf3f9d] - page.onError - stack:
  (anonymous function) (https://jsta.sh/media/all.js?1459:16)
  t (https://jsta.sh/media/all.js?1459:16)
  (anonymous function) (https://jsta.sh/media/all.js?1459:17)
  (anonymous function) (https://jsta.sh/media/all.js?1459:8)
  (anonymous function) (https://jsta.sh/media/all.js?1459:8)
  (anonymous function) (https://jsta.sh/media/all.js?1459:8)
  I (https://jsta.sh/media/all.js?1459:2)

и т.п.

Я надеюсь, что, несмотря на то, что он тесно связан с другими вопросами об этой проблеме .bind(), мой вопрос полезен для тех, кто обычно хочет добавить функциональность к своей готовой реализации Selenium PhantomJS. Мне бы понравилось, если бы я мог изменить библиотеку JavaScript, реализованную моим стеком Ghostdriver-PhantomJS-Selenium, вместо того, чтобы напрямую добавлять прокладку es5 на каждую страницу, которую я посещаю, но я не уверен, как я могу это сделать и если. Начинаю чувствовать, что такие вещи были бы проще, если бы я просто построил этот тестер на чистом PhantomJS вместо того, чтобы фильтровать его через другой фреймворк.

Мои характеристики:

  • Селен версии 1.43
  • ФантомJS 1.98
  • Питон 2.7
  • Ubuntu 14.04 LTS (GNU/Linux 3.17.1-эластичный x86_64)

*** es5-shim дает следующий многообещающий результат, когда я использую его в консоли phantomjs:

phantomjs> console.log(Object.keys)
function keys() {
    [native code]
}
undefined
phantomjs> var shim = require("/home/dunkin/scripts/es5-shim.js")
undefined
phantomjs> console.log(Object.keys)
function keys(object) {
        if (isArguments(object)) {
            return originalKeys(ArrayPrototype.slice.call(object));
        } else {
            return originalKeys(object);
        }
    }
undefined
phantomjs> 

person Magenta Nova    schedule 10.02.2015    source источник


Ответы (1)


Похоже, что в текущей версии 2.1 полифиллы включены в дистрибутив phatomjs. Попробуйте загрузить последнюю версию.

person Zon    schedule 11.05.2018
comment
Как же так? Где ты это видел? - person Venelin; 20.05.2019
comment
Экспериментально. - person Zon; 20.05.2019