【问题标题】:Load Google Maps API in jsdom在 jsdom 中加载 Google Maps API
【发布时间】:2018-02-20 19:00:22
【问题描述】:

我正在尝试在 jsdom 中加载 Google Maps API。更具体地说,我有兴趣从 getPanorama 回调函数中获取数据。但是,当我执行以下代码时,我看到“执行没有错误”,但没有看到任何消息“状态正常”或“状态不正常”。

var jsdom = require("jsdom");
var cafe = {lat: 51.47803167, lng: 0.141212256};

jsdom.env({
  html: "<html><body></body></html>",
  scripts: ["https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"],
  done: function (err, window) {
    if (err) {
      console.log('Error is' + err);
    } else {
      // console.log(window.google);
      var google = window.google;
      var sv = new google.maps.StreetViewService();
      sv.getPanorama({location: cafe}, function(data, status) {
        if (status === 'OK') {
          console.log('status ok');
          console.log(data);
        } else {
          console.log('status not ok');
        }
      });
      console.log('Executed with no error');

    }
  }
});

我也尝试修改代码并使用 jsdom.jsdom 代替 env,但没有任何效果。关于如何从节点代码中的回调中检索数据的任何想法?

【问题讨论】:

  • 如果有一个能够测试它的小提琴会很棒。我根本不知道 jsdom,所以我可能不会有任何帮助,但是......你有没有尝试过使用不同 API 版本的相同代码? IE。 v=3 而不是 v=3.exp?

标签: javascript node.js google-maps google-maps-api-3 jsdom


【解决方案1】:

我找到了解决方案。请注意,此示例代码使用更新版本的 JSDOM API:

function runGmaps(lat, lng) {

    const jsdom = require("jsdom");
    const { JSDOM } = jsdom;

    const dom = new JSDOM(`
    <!DOCTYPE html>
    <html>
        <body>
            <div id="map"></div>
            <script>
                var map;
                function initMap() {
                    map = new google.maps.Map(document.getElementById('map'), {
                        center: {lat: ${lat}, lng: ${lng}},
                        zoom: 8
                    });
                }

                function loadScript(url, callback) {
                    var head = document.getElementsByTagName('head')[0];
                    var script = document.createElement('script');
                    script.type = 'text/javascript';
                    script.src = url;

                    // Fire the loading
                    head.appendChild(script);

                    // Then bind the event to the callback function.
                    // There are several events for cross browser compatibility.
                    script.onreadystatechange = callback;
                    script.onload = callback;
                }

                loadScript("https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY", initMap);
            </script>
        </body>
    </html>
    `, {
        runScripts: "dangerously",
        resources: "usable"
    });
}

【讨论】:

    【解决方案2】:

    即使找到了解决方案,我也可以分享我开始使用的不太冗长的解决方案。

    jsdom 11.6.2 用于与 jest

    的集成测试
    import GeolocationService from './geolocation'
    import { JSDOM } from 'jsdom'
    
    const getGoogleApi = () => new Promise(res => {
        const {window} = new JSDOM(`
        <!doctype html>
        <html>
            <head>
                <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDcRzhgDwvAiAcXKvDnXhczwOrKNCHhKS0&libraries=places&callback=googleReady"></script>
            </head>
        </html>`, {runScripts: 'dangerously', resources: 'usable'})
    
        window.googleReady = () => {
            res(window.google)
        }
    })
    
    it('test GeolocationService', async () => {
    
        const google = await getGoogleApi()
        const sut = new GeolocationService({googleApi: google})
    
        const suggestions = await sut.getSuggestions({
            input: 'bratis',
            anchorLocation: {
                latitude: 48.669,
                longitude: 19.699
            }
        })
    
        suggestions.forEach(s => {
            expect(s).toHaveProperty('id')
            expect(s).toHaveProperty('name')
            expect(s).toHaveProperty('terms')
    
            const {terms, name} = s
            expect(name.startsWith('Bratis')).toBe(true)
            expect(Array.isArray(terms)).toBe(true)
            expect(name.startsWith(terms[0])).toBe(true)
        })
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 2017-04-10
      • 2013-03-19
      • 1970-01-01
      相关资源
      最近更新 更多