10
votes

Rails3 Google Maps Test avec sélénium

J'essaie de tester une application Google Maps avec Rails3. J'utilise du concombre avec Capybara et Selenium pour des tests JavaScript. J'ai une carte où j'attends que Google Maps soit chargé, puis envoyez une demande AJAX à mon serveur, où je reçois des emplacements que j'insère dans la carte. Je me demande si elle est possible avec Selenium d'attendre que Google Maps soit chargé, l'appel AJAX à mon serveur est terminé et le marqueur est placé dans la carte. L'autre problème est de savoir comment sélectionner ce marqueur dans Google Maps. Existe-t-il des sélecteurs?

ou devrais-je aller dans l'autre sens et utiliser un cadre de test JS comme Jasmine à tester si mes classes sont chargées et ainsi de suite. Je n'ai aucune expérience avec Jasmine, il est donc possible de tester une carte Google? P>

Peut-être que quelqu'un connaît une solution ou un indice si ce n'est pas possible, ou une solution de contournement ou ...;) P>

[Mise à jour 1] forte> P>

J'ai découvert comment sélectionner les marqueurs dans Google Maps. Si vous regardez tests de sélénium Googles Vous pouvez vérifier ce qu'ils font. Par exemple, sélectionner un marqueur: Strike> p>

// marker is the marker returned by google maps after adding it to the map
$(marker).attr('id', "marker_1");


2 commentaires

grande question, j'aimerais inclure ceux-ci dans mon gemme GMAPS4Rails


J'avais l'impression que, parce que le sélénium est écrit en JavaScript, les mesures de sécurité des moteurs JS de navigateur empêchent les tests entre les domaines (comme méthode de prévention du script inter-sites.)


4 Réponses :


0
votes

à votre première question - utilisez WaitForCondition avec un script qui teste le présentiel des marqueurs. xxx


1 commentaires

Je l'ai essayé et, comme vous pouvez le constater dans ma question mise à jour, je ne peux pas utiliser ce waitforCondition ou wait_for_condition fonction. Une idée?



1
votes

Ce que je fais avec le mien consiste à exécuter les appels dans vos définitions d'étape, comme:

page.Execute_script ("LaunchMap ()")

Vérifiez alors leur existence dans la page..then Faites votre chèque Ajax normal dans Capybara. Le marqueur sera contenu dans un droit div? Ensuite, si vous appelez LaunchMap et créez les marqueurs, Capybara devrait pouvoir trouver vos marqueurs

mise à jour

Découvert sur ce plugin: http://vigetlabs.github.com/jmapping/examples/ < / a>

Cela vous donne une balise sémantique pour votre Google Maps (pour une dégradation gracieuse) vous permettant de vérifier réellement si un marqueur existe à l'aide de Capybara. J'espère que cela vous aide (n'a pas le temps de le tester, mais il semble prometteur)


6 commentaires

THX pour votre réponse! Pourquoi devrais-je appeler un lanceur () lorsque je fais des tests d'intégration? Ne sont-ils pas conçus pour tester le comportement des utilisateurs? À mon avis, ils devraient tester les sites "comme ils sont" sans appeler de JavaScript supplémentaire de l'intérieur des tests. Pourriez-vous me donner un exemple comment vous choisiriez les marqueurs? Désolé mais je ne comprends pas ton point "... Capybara devrait pouvoir trouver vos marqueurs". Thx et meilleures salutations!


HMM, je pense que j'ai mal compris les marqueurs ayant des identifiants de div. En tout cas, vous appelez le script pour savoir qu'il fonctionne. Si le script ne parvient pas à exécuter Capybara reviendra de faux. C'est donc un chèque déjà. Vous pouvez également essayer: Page.Evaluate_script ("LaunkMap ()") Si votre fonction LaunchMap renvoie true, mais prenez note que cela pourrait casser sous des fonctions complexes comme indiqué ici: Github.com/jnicklas/capybara


Le plug-in a l'air bien, mais c'est beaucoup de code supplémentaire, je dois inlcucer. Il utilise le gestionnaire de marqueur pour GM et un plugin Meta Tag pour JQuery. Je me demande si c'est généralement possible de sélectionner des marqueurs hors de JQuery, ou XPath ou tout autre sélecteur DOM. J'ai également essayé également le plug-in Selenium pour Firefox, où vous pouvez enregistrer vos actions de clic, etc.p. Mais je ne comprends pas de bon résultat, tant que cela ne sélectionne que la superposition des DIV IMHO. Toute autre idée?


Eh bien soit l'utiliser (comme c'est certainement un bon ajout à votre code ... je l'utiliserai moi-même quand une chance vient) ou vous devrez faire toutes vos fonctions dans JQuery ou Google Maps pour renvoyer quelque chose afin que vous puissiez évaluer. Il utilise la page.Evaluate_script. quelque chose comme la page.évaluer ("PlaceMarker (XCoor, YCoor)" == (quelque chose de fonction retourne pour vérifier si le marqueur a été placé)


hmmm, mais si je veux tester, que ma fenêtre d'information personnalisée s'ouvre lorsque je clique sur un marqueur? Comment pourrais-je simuler cela? Déclencher un événement de clic sur l'objet JS?


Votre fenêtre personnalisée est-elle une nouvelle fenêtre ou une div?



1
votes

J'ai trouvé un moyen d'intégration testez ma carte Google avec RSPEC et Capybara. Je voulais écrire un test pour affirmer que le contenu que j'ai reçu d'un flux JSON interne s'est retrouvé sous forme de marqueurs et d'info Windows sur ma carte (Google Maps API V3) dans une application Rails 4.

Le problème: Même lorsque j'ai dirigé les tests avec Selenium WebDiver prenant en charge JS, je n'ai pas trouvé de moyen de sélectionner les marqueurs avec Capybara pour vérifier leur contenu. P>

Ma solution: 1. J'ai ajouté un div avec une boîte d'identité ID sur mon marquage HTML 2. J'ai écrit trois méthodes d'aide à mon JS qui avaient accès à mes marqueurs de Maps et ajouté les résultats à la zone de test. 3. Dans Capybara, j'ai exécuté les méthodes d'assistant et je m'attendais à trouver le contenu ou les valeurs attendus dans la boîte. P>

Le code: p>

html: strong> p> xxx pré>

JS-Aides: strong> Dans l'application / actifs / javascripts / événements.js.js p> xxx pré>

"marqueurs" dans mon code est un tableau I pousse chaque marqueur après que je l'ai ajouté à la carte. Je peux être sûr que le contenu est en réalité sur la carte si c'est dans le tableau des marqueurs. P>

Test: strong> p>

spec/features/map_feature_spec.rb:

require "rails_helper"

describe "Map", js: true do
  let!(:john){create(:user)}
  let!(:event1){create(:event, user: john)}
  let!(:event2){create(:event)}

  it "shows a marker for a geocoded event on front page" do
    visit '/'
    find('#main-map-canvas')
    page.execute_script('testInfo()')
    expect(page.find("div#info-box").text).to eq(event1.title)
  end

  it "shows a marker for each geocoded event on front page" do
    visit '/'
    find('#main-map-canvas')
    page.execute_script('testInfoCount()')
    expect(page.find("div#info-box").text).to eq("2")
  end


  it "shows a marker for an event on event's page" do
    visit "/events/#{event1.id}"
    expect(page).to have_css("#single-map-canvas")
    page.execute_script('testInfo()')
    expect(page.find("div#info-box").text).to eq(event1.title)
  end

  context "Tooltips" do
  let!(:event1){create(:event)}
  let!(:event2){create(:event)}

    it "shows title and date on frontpage" do
      visit "/"
      find('#main-map-canvas')
      page.execute_script('testInfoWindow()')
      expect(page.find("div#info-box")).to have_content("Pauls Birthday Party, #{event1.nice_date}")
    end

  end
end
  • Pour exécuter le javascript selenium webdiver et Firefox doit être installé ('' GEM "selenium-webdriver" "" dans votre gemfile) p> li>

  • Je crée le contenu du test (let! ...) à l'aide de fille d'usine. p> li>

  • Exécution des tests Vous verrez réellement les marqueurs sur la carte et leur contenu apparaît dans la zone de test. p> li> ul> p>


0 commentaires

0
votes

Assurez-vous d'activer l'URL Capybara utilise pour exécuter le serveur de test dans Google Console pour votre application.

Vous pouvez vérifier cette URL (et le message d'erreur lors du chargement de Google Maps) en définissant config.debug = true dans le bloc de chargement du pilote Capybara.


0 commentaires