2016-04-17 4 views
2

Я пишу приемочные тесты с использованием Selenium для тестирования приложения, использующего API Карт Google. Чтобы проверить размещение маркера карты, я using un-optimized markers и уникальные атрибуты заголовка, чтобы позволить мне нацеливать элементы маркера (из Selenium с запросами XPath).Google Maps Неоптимизированный маркер/fitBounds

У меня возникла проблема, при которой вызов google.maps.Map.fitBounds() заставляет маркеры удаляться из DOM, когда используются не оптимизированные маркеры. Вы должны многократно называть fitBounds(), чтобы это произошло. Это происходит только с неоптимизированными маркерами, и само приложение работает должным образом.

Я написал короткий тестовый сценарий для репликации в браузере: пожалуйста, запустите ниже.

I также create a fiddle.

Я не видел ничего подходящего в документах API.

Любая помощь будет отличной.

<html> 
    <head> 
    <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js"></script> 
    <style type="text/css"> 
    #container { 
     width: 800px; 
     height:500px; 
    } 
    </style> 
    </head> 
    <body> 
    <button id="show">Show</button> 
    <button id="hide">Hide</button> 
    <div id="container"></div> 
    <script type="text/javascript"> 

     // Repeatedly click on 'Hide' then 'Show' (8+ times sometimes). At some point the markers disappear and not come back - even if the code for showing/hiding markers is entirely commented out. 
     // The issue seems to be with the map.fitBounds() call when un-optimized markers are being used. 
     // Note - un-optimized markers are needed for targeting marker HTML elements as part of an acceptance test. 
     // Replicated on: 45.0.2 Firefox; 49.0.2623.112 m Chrome. 

     function changeBounds(boolToggle) { 
     //return; // TODO - if you add this line in the problem is fixed. 
     var bounds = new google.maps.LatLngBounds(); 
     var latLng = boolToggle ? new google.maps.LatLng(70, 70) : new google.maps.LatLng(30, 30); 
     bounds.extend(marker1.getPosition()); 
     bounds.extend(marker2.getPosition()); 
     bounds.extend(latLng); 
     map.fitBounds(bounds); 
     } 

     var mapOptions = { 
     center : { lat : 50, lng : 50 }, 
     zoom: 5, 
     }; 

     var map = new google.maps.Map(document.getElementById("container"), mapOptions); 

     var marker1 = new google.maps.Marker({ 
     position : { 
      lat : 51, 
      lng : 51, 
     }, 
     title : "MARK1", 
     optimized : false 
     }); 

     var marker2 = new google.maps.Marker({ 
     position : { 
      lat : 52, 
      lng : 52, 
     }, 
     title : "MARK2", 
     optimized : false 
     }); 

     marker1.setMap(map); 
     marker2.setMap(map); 

     document.getElementById('show').onclick = function() { 
     //marker1.setVisible(true); // TODO - The original code was showing/hiding the markers but the issue is replicated without even doing this. 
     //marker2.setVisible(true); 

     changeBounds(true); 
     } 

     document.getElementById('hide').onclick = function() { 
     //marker1.setVisible(false); // TODO - The original code was showing/hiding the markers but the issue is replicated without even doing this. 
     //marker2.setVisible(false); 

     changeBounds(false); 
     } 
    </script> 
    </body> 
    </html> 

Edit: Я сообщил об этом как об ошибке с помощью Google. См. https://code.google.com/p/gmaps-api-issues/issues/detail?id=9912

+0

я застрял в уменьшенной Gmaps API, но я могу сказать, что это: маркера физически исчезают (их элементы DOM), они не возвращаются, если я сброшу карту для маркера (если вы измените оптимизацию на true, а затем запустите .setMap (карту) на маркер, который он появится, но если вы установите его на false и снова запустите setMap, он исчезнет!), и единственный способ сделать маркеры снова появиться - немного перетащить карту. –

+0

Сделал скрипку рендерингом карты, увидел проблему с ней в Chrome – geocodezip

ответ

4

Я не знаю, в чем проблема, это должно быть проблемой в API Карт Google, но я нашел решение: используйте методы pan *. Для меня лучший, использовал panBy, который говорит карте, чтобы панорамировать x и y пиксели. Перемещение 0 пикселей работало нормально, поэтому просто добавив map.panBy (0,0) после того, как fitBounds исправили исчезающие маркеры.

Однако это означает потерю приятного постепенного перемещения карты, поэтому вместо этого я использовал panBy на праздном событии. Окончательное решение было бы добавить следующее после создания карты:

google.maps.event.addListener(map, 'idle', function() { 
    map.panBy(0,0); 
}); 

Я извиняюсь, но у меня нет достаточно времени, чтобы просеять через API, Google, чтобы увидеть, что проблема есть.

Что не получилось:

  • marker.setMap (или любое другое имущество)
  • делает маркер перетаскиваемым или не
  • google.maps.event.trigger (карта, 'some_event') ;

Похожие:

+1

Спасибо - обходное решение помогло. Я также отправил сообщение об ошибке с помощью Google: https://code.google.com/p/gmaps-api-issues/issues/detail?id=9912 – Pete171

+0

Google объединил приведенную выше тему с ошибкой: https: // code .google.com/p/gmaps-api-issues/issues/detail? id = 5716 Похоже, что они приняли ошибку и могут ее перепроверить. Надеемся, что мы увидим исправление в будущих выпусках. – CHawk

0

Подобно сидерит, я понятия не имею, как непосредственно исправить ошибку. Тем не менее, решение, которое я нашел, чтобы вызвать «изменить размер» событие для карты:

google.maps.event.trigger(google_map, "resize"); 
+0

Вы уверены? Потому что я помню, что это была одна из первых вещей, которые я пробовал, и это провалилось. Это даже там, в вещах, которые не сработали. –

+0

Yep - он успешно помещает маркеры на карту для меня. Однако в некоторых случаях вызов resize испортил границы на карте, поэтому это может быть не подходящее решение для всех. Я не тестировал с запуском любого другого события карты Google. – CHawk

Смежные вопросы