使用 Selenium 和 PhantomJS 将 javascript polyfill 注入页面

Posted

技术标签:

【中文标题】使用 Selenium 和 PhantomJS 将 javascript polyfill 注入页面【英文标题】:Injecting a javascript polyfill onto a page with Selenium & PhantomJS 【发布时间】:2015-04-10 21:23:48 【问题描述】:

这里和其他地方有很多关于 PhantomJS 缺少 Function.prototype.bind 方法的讨论,许多有用的慈善家已经编写了 shims/polyfills 或将其他人指向这些资源。我正在通过 Selenium Webdriver 和 Python 绑定来实现 PhantomJS。我尝试了几种方法来使用这个 polyfill,但都无济于事。目前我在我的 webdriver-inheriting 测试器类中使用以下代码:

    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 实现添加功能的人很有用。如果我可以修改由我的 Ghostdriver-PhantomJS-Selenium 堆栈实现的 JavaScript 库,而不是直接将 es5 shim 添加到我访问的每个页面,我会很高兴,但我不确定我该怎么做或是否可以这样做。开始觉得如果我只是在裸 PhantomJS 上构建这个测试器而不是通过另一个框架过滤它,这样的事情会更简单。

我的规格:

Selenium 版本 1.43 PhantomJS 1.98 Python 2.7 Ubuntu 14.04 LTS (GNU/Linux 3.17.1-elastic x86_64)

*** 当我在 phantomjs 控制台中使用 es5-shim 时,它会产生以下有希望的结果:

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> 

【问题讨论】:

【参考方案1】:

当前版本 2.1 似乎已将 polyfill 包含在 phatomjs 发行版中。试试download the latest one。

【讨论】:

怎么样?你在哪里看到的? 实验性的。

以上是关于使用 Selenium 和 PhantomJS 将 javascript polyfill 注入页面的主要内容,如果未能解决你的问题,请参考以下文章

更改 HTTP 标头 Selenium + PhantomJS

使用selenium phantomjs上传文件时,Python脚本会挂起

使用selenium和phantomJS浏览器获取网页内容的小演示

Python爬虫(二十一)_Selenium与PhantomJS

scrapy使用PhantomJS和selenium爬取数据

使用 Python/PhantomJS/Selenium 滚动无限页面