【问题标题】:PhantomJS JavaScript errors from gstatic, but not in browser来自gstatic的PhantomJS JavaScript错误,但不在浏览器中
【发布时间】:2014-12-11 17:44:23
【问题描述】:

我最近通过我们的 PhantomJS 测试套件运行了我们的网站,并遇到了无法在浏览器中手动重现的 JavaScript 错误。在google maps api中发现这些错误,Capybara返回的文字如下:

TypeError: Unable to delete property.
TypeError: Unable to delete property.
   at :215
   at https://maps.gstatic.com/maps-api-v3/api/js/19/3/main.js:20 in cf
   at https://maps.gstatic.com/maps-api-v3/api/js/19/3/main.js:20 in cf
   at https://maps.gstatic.com/maps-api-v3/api/js/19/3/main.js:19
   at :214
   at https://maps.gstatic.com/maps-api-v3/api/js/19/3/main.js:20 in cf
   at https://maps.gstatic.com/maps-api-v3/api/js/19/3/main.js:20 in cf
   at https://maps.gstatic.com/maps-api-v3/api/js/19/3/main.js:21
   at :176
   at :31
   at https://maps.gstatic.com/maps-api-v3/api/js/19/3/main.js:26 in Yf
   at :178

这是 Capybara、PhantomJS 或 Google 地图 API 的已知错误吗?问题可能是由 PhantomJS 中的用户代理字符串引起的吗?

【问题讨论】:

    标签: google-maps capybara phantomjs


    【解决方案1】:

    我正在使用 Cucumber / Poltergeist,我通过创建以下扩展来解决这个问题:

    /features/support/env.rb

    Capybara::Poltergeist::Driver.new(app, 
      :extensions => ["features/support/ignore_gmaps_errors.js"]
    )
    

    /features/support/ignore_gmaps_errors.js

    window.onerror = function(message) {
      if (message == 'TypeError: Unable to delete property.') {
        console.log('Ignoring gmaps error');
        return false;
      } else {
        return true;
      }
    };
    

    【讨论】:

    • 我为 RSpec 尝试了这个解决方案,效果很好。谢谢。
    • 请注意,如果您有任何其他 "TypeError: Unable to delete property" 错误,这些将被忽略,但我无法使其更具体到 google maps 错误,这是只有这样我才能让它工作。
    【解决方案2】:

    Google 地图 API 实验版于今天上午(12 月 11 日)更新,导致此损坏。默认情况下包括:

    <script src="//maps.googleapis.com/maps/api/js?libraries=places"></script>

    它使用latest experimental version。将自己锁定到最新版本:

    <script src="//maps.googleapis.com/maps/api/js?v=3&libraries=places"></script>

    应该解决这个问题。

    【讨论】:

    • 虽然这暂时有所帮助,但现在(显然)已将更新推送到发布版本,这些更改不再有帮助。
    • 由于这不再有效,我将删除答案。我已经向 google maps api 的人员提交了一个错误,我们会看看它的去向。
    • 无需删除答案,但请对其进行编辑并在顶部添加一条说明它不再起作用的注释。错过cmets太容易了。
    • 你能分享错误报告的 URL 来跟踪这个吗?
    【解决方案3】:

    使用包含解决方法的最新实验版 Google 地图 (v3.19) 为我解决了这个问题:https://code.google.com/p/gmaps-api-issues/issues/detail?id=7475#c20

    [编辑] Google Maps v3.19 是 released as the production version on 17 Feb 2015。此外,PhantomJS 版本 2 于 2015 年 1 月 23 日发布,其中包含一个 updated WebKit module,它没有出现 Unable to delete property 问题。

    【讨论】:

      【解决方案4】:

      尝试将用户代理设置为

      Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1

      Google 提供的 JavaScript 不能通过其默认用户代理完全运行。 PhantomJS 1.x 基于 QtWebKit 的一个非常古老的分支,它与 Chrome 13 相当(该用户代理字符串的原因)。

      looks like 你可以这样做:

      @session = Capybara::Session.new(:poltergeist)
      @session.driver.headers = { 'User-Agent' => 'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1' }
      

      【讨论】:

      • 我遇到了与使用 capybara-webkit 的 OP 相同的错误。我将用户代理设置为建议的值,但仍然收到TypeError: Unable to delete property 错误。只有当我尝试使用地理编码器模块时,才会发生该错误。这个错误是今天早上突然开始的。
      • 好的,这表明问题不在于 PhantomJS 或 capybara-webkit,而在于 capybara 本身。某些不同的驱动程序是否存在相同的问题?我只是用普通的 PhantomJS 再试一次,不管有没有上面的用户代理字符串都没有错误。
      • 您具体尝试了什么?我的代码是:gist.github.com/sgringwe/f7d9859417d8638abf25
      • 我做了this,但是当我第一次编写脚本时,GM实际上使用了地图API,现在不再使用了。至少不是公开的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2013-12-09
      • 2018-09-28
      • 2022-07-19
      相关资源
      最近更新 更多