Rails3 Google Maps тестирует с селеном - PullRequest
8 голосов
/ 17 марта 2011

Я пытаюсь протестировать приложение Google Maps с Rails3.Я использую огурец с капибарой и селеном для тестирования JavaScript.У меня есть карта, на которой я жду загрузки карт Google, а затем отправляю запрос ajax на мой сервер, где я получаю местоположения, которые вставляю в карту.Мне интересно, можно ли с помощью селена подождать, пока не загрузятся карты Google, вызов ajax на мой сервер завершен, и маркер размещен внутри карты.Другой вопрос, как выбрать этот маркер в Google Maps.Есть ли селекторы?

Или я должен пойти другим путем и использовать среду тестирования JS, такую ​​как Jasmine, чтобы проверить, загружены ли мои классы и так далее.У меня нет опыта работы с Жасмин, так можно ли проверить карты Google?

Может быть, кто-то знает решение, или подсказку, если это невозможно, или обходной путь или ...;)

[ОБНОВЛЕНИЕ 1]

Я узнал, как выбирать маркеры на картах Google.Если вы посмотрите на тесты селена googles , вы можете проверить, что они делают.Например, выбор маркера:

waitForElementPresent   xpath=//img[contains(@src,'marker')]

Но тут возникает следующая проблема.Как выбрать определенный маркер?Есть ли способ в javascript google maps API назначить ему идентификатор, чтобы я мог использовать #marker_1, #marker_2 ...?

И еще одна странная вещь - эта функциякак wait_for_element или wait_for_condition недоступны в моих определениях шагов огурца.Используются ли в Google тесты селена собственной функцией, подобной этой waitForElementPresent?Или это стандартные функции селена?Я нашел много постов, где они всегда используют что-то вроде

selenium.wait_for_condition
selenium.wait_for_element

or

@selenium.wait_for_condition
...

В моих определениях шагов selenium и @selenium var nil.Как я могу получить доступ к этим методам?Я также нашел этот пост , но это с октября 2008 года, поэтому я думаю, что должно быть лучшее решение (кстати, это решение работает на первый взгляд).

Как и на этой странице , они дают обзор нескольких методов селена, как ожидать условие или элемент.Это все еще присутствует?Как я могу использовать эти функции?

[ОБНОВЛЕНИЕ 2]

Черт, я обнаружил, что упомянутые выше тесты на селен предназначены для V2 Googleкарты, не для V3.Я пробовал это с

wait_until { page.has_xpath?("//img[contains(@src,'marker')]") }

Но это не работает.Маркер виден на карте, но я получаю ошибку тайм-аута, потому что с этим селектором XPath он не найден.Я задаюсь вопросом, возможно ли вообще выбрать маркер из DOM.

Я также попытался присвоить маркеру дополнительный атрибут при его создании:

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

Нокогда я пытаюсь получить к нему доступ с помощью селектора jQuery $("#marker_1"), он не находит его.Итак, решения пока нет.

Ответы [ 4 ]

1 голос
/ 29 марта 2011

Что я делаю с моим, так это выполняю вызовы в ваших определениях шагов следующим образом:

page.execute_script ( "launchmap ()")

затем проверьте их наличие на странице .. затем выполните обычную проверку ajax в капибаре. маркер будет содержаться в праве div? тогда, если вы вызовете launchmap и создадите маркеры, капибара ДОЛЖНА найти ваши маркеры

UPDATE

узнал об этом плагине: http://vigetlabs.github.com/jmapping/examples/

это дает вам семантическую разметку для ваших карт Google (для постепенного ухудшения), позволяющую вам фактически проверить, существует ли маркер с использованием капибары. надеюсь, что это поможет (нет времени, чтобы проверить это, но выглядит многообещающе)

1 голос
/ 21 апреля 2015

Я нашел способ проверить интеграцию моей карты Google с RSpec и Capybara. Я хотел написать тест, чтобы утверждать, что содержимое, полученное из внутреннего JSON-канала, заканчивалось в виде маркеров и информационных окон на моей карте (Google Maps API V3) в приложении Rails 4.

Проблема: Даже когда я запускал тесты с Selenium Webdriver, который поддерживает JS, я не нашел способа выбрать маркеры с помощью Capybara для проверки их содержимого.

Мое решение: 1. Я добавил тег div с идентификатором в свою HTML-разметку. 2. Я написал три вспомогательных метода в мой JS, которые имели доступ к маркерам моих карт, и добавил результаты в тест-бокс. 3. В Капибаре я выполнил вспомогательные методы и ожидал найти ожидаемое содержимое или значения в поле.

Код:

HTML:

<div id="map-canvas"></div>
<div id="info-box"></div>

JS-хелперы: в app / assets / javascripts / events.js

// Test helper methods
testInfo = function(){
  document.getElementById("info-box").innerHTML = markers[0].title;
};

testInfoCount = function(){
  document.getElementById("info-box").innerHTML = markers.length;
};

testInfoWindow = function(){
  document.getElementById("info-box").innerHTML = markers[0].title + ", " + markers[0].time;
};

"маркеры" в моем коде - это массив, который я вставляю в каждый маркер после добавления его на карту. Я могу быть уверен, что контент действительно находится на карте, если он находится в массиве маркеров.

Тест:

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
  • Для запуска javascripts необходимо установить Selenium Webdriver и Firefox ('' gem "selenium-webdriver" '' в вашем Gemfile)

  • Я создаю тестовый контент (пусть! ...) с помощью Factory Girl.

  • Запустив тесты, вы фактически увидите маркеры на карте, а их содержимое появится в окне теста.

0 голосов
/ 06 марта 2016

Обязательно включите URL, который использует capybara для запуска тестового сервера в консоли Google для вашего приложения.

Вы можете проверить этот URL (и сообщение об ошибке при загрузке карт Google), установив config.debug= true в блоке загрузки конфигурации драйвера Capybara.

0 голосов
/ 17 марта 2011

К первому вопросу - используйте waitForCondition со скриптом, который проверяет наличие маркеров.

waitForCondition ( script,timeout ) Runs the specified JavaScript snippet repeatedly until it evaluates to "true". The snippet may have multiple lines, but only the result of the last line will be considered. Note that, by default, the snippet will be run in the runner's test window, not in the window of your application. To get the window of your application, you can use the JavaScript snippet selenium.browserbot.getCurrentWindow(), and then run your JavaScript in there

Arguments:

script - the JavaScript snippet to run timeout - a timeout in milliseconds, after which this command will return with an error
...