在 Rails 中使用 Capybara 和 Selenium 测试 Google 地图标记

Posted

技术标签:

【中文标题】在 Rails 中使用 Capybara 和 Selenium 测试 Google 地图标记【英文标题】:Testing Google Map Markers with Capybara and Selenium in Rails 【发布时间】:2018-12-14 00:58:10 【问题描述】:

我有一个谷歌地图页面,可以搜索地址,然后显示 100 英里范围内的标记。我正在尝试测试我的标记是否有一个内容窗口,当点击使用 Capybara、Selenium 和 Rails 时会弹出一个内容窗口。

我收到一条错误消息“Selenium::WebDriver::Error::ElementNotInteractableError: 元素无法滚动到视图中” 有谁知道如何解决这个问题或更好的方法来测试谷歌地图标记的弹出内容窗口?滚动在 Google 地图中不起作用,所以我假设这就是发生这种情况的原因。

  it 'enters in an address for IN Adjusters', js: true do
    visit '/maps'
    fill_in 'address', with: '4511 W 200 S'
    click_button('Search')
    sleep(5)
    element = find('map#gmimap0')
    element.click
    expect(page).to have_content("Burke Eric")
  end

【问题讨论】:

【参考方案1】:

您可以尝试在查找地图标记时使用 Capybara 的 visible: false 属性:

element = find('map#gmimap0', visible: false)

这应该允许您调用 click 方法,只要该元素在 DOM 中可用。

谢谢!

【讨论】:

我认为这也可以!不幸的是,我仍然收到同样的错误。不过我很高兴你提到了它,因为现在我认为可能存在不同的问题。 啊,好点子 - 看起来与画布元素交互可能存在问题。一种可能的解决方法是将地图标记呈现为图像:***.com/a/41132330/2076253 mojotech.com/blog/… developers.google.com/maps/documentation/javascript/reference/… 如果可行,您可以将 optimized 标志设置为 false 以用于您的测试环境。 在测试应用程序时指定visible: false 通常是一个糟糕的主意,而且您无论如何都不能单击不可见的元素。同样在这种情况下,错误来自click 调用,因此它已经找到了该元素,visible: false 将什么也不做。【参考方案2】:

这里的问题是,从技术上讲,map#gmimap0 元素的高度为 0px,因此驱动程序无法确定实际点击的位置。如果您使用带有 selenium 的 Chrome,并且 map#gmimap0 元素有一个具有大小的子元素(例如 area 元素),那么您可以这样做

find('map#gmimap0 area').click

它可能会起作用,但是我相信您正在使用带有 selenium 的 Firefox,由于 geckodriver 或 firefox 中的错误,它仍然无法像那样工作。幸运的是,有一种方法可以在任一浏览器中使用,即指定点击偏移量。这导致 selenium 不担心元素大小,只需单击页面上与元素位置偏移的位置。

find('map#gmimap0').click(x: 10, y: 10) # offset x an y within the size of the marker

【讨论】:

我确实将 x 和 y 分别更改为 11,以防其他人看到此内容。 @chasedougherty xy 只需选择即可将点击放置在您使用的任何大小的标记内。

以上是关于在 Rails 中使用 Capybara 和 Selenium 测试 Google 地图标记的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 3.1 中使用 Capybara、Rspec 和 Selenium 进行测试时登录失败

如何使用rails cucumber,rspec,capybara在视图(dhtml)中测试动态部分?

Rails - 失去与集成测试和 Capybara 的会话 - CSRF 相关?

使用 Cucumber 和 Capybara-Webkit 在 Rails 4 上进行 typeahead.js 测试失败

Rails Cucumber使用Capybara测试AJAX

在 Cucumber + Capybara + PhantomJS 在 Rails 中调试 jQuery Ajax