在测试期间应该 Capybara/poltergeist/phantomjs 运行 我的 JS 吗?

Should Capybara/poltergeist/phantomjs run my JS during tests?

我已经 Capybara/poltergeist/phantomjs 设置 运行 一些 UI 测试。我的第一个实验如下:

  it 'can like a photo', :js => true do
    visit root_path(as: 1)

    page.first("img.lazy").trigger('click')
    save_screenshot('/Users/martinhinge/Downloads/file.png')
    within("#control-sidebar-tab-photo") do
      page.find("#like").click
      expect("#control-sidebar-tab-photo #like").to have_css(".btn-success")
    end
  end

我之前截图了

page.first("img.lazy").trigger('click')

并且一切都从服务器加载正常。

page.first("img.lazy").trigger('click')

应该触发一些 javascript 打开侧面板(在我的应用程序中工作正常)。但是当我 运行 它没有任何反应。

phantomjs应该执行js吗?

--o 编辑 o--

我已将点击触发器更改为:

first("img.lazy", minimum: 1).click

当我这样做时,我得到:

Capybara::Poltergeist::MouseEventFailed: Firing a click at co-ordinates [83, 227] failed. Poltergeist detected another element with CSS selector 'html body.fixed.index.photos.sidebar-collapse.sidebar-mini.skin-black div.wrapper div.content-wrapper section.content div.row div#photogrid div.col-lg-12.col-sm-12 div.box.box-solid div.box-body.infinite-container div.photo-widget div.photo-widget-content div.photo-widget-header' at this position. It may be overlapping the element you are trying to interact with. If you don't care about overlapping elements, try using node.trigger('click').

我尝试将其更改为:

first(".photo-widget-header", minimum: 1).click

现在我没有得到上面的错误,但是 JS 没有被触发。 我知道 JS 没有被触发的原因是找不到“#like”元素。

是的,它应该 运行 JS。如果你真的想测试你的 UI 是否正常工作,你也应该调用 .click 而不是 .trigger('click') 。 trigger('click') 绕过检查元素是否实际可点击,因此可以隐藏许多错误。另外 first 就像你使用它会绕过水豚的等待行为并可能导致不稳定的测试,所以你可能想要使用 first("img.crazy", minimum: 1) 或设置 Capybara.wait_on_first_by_default = true.

至于为什么您没有看到预期的行为,如果您仅基于屏幕截图,则可能只是屏幕截图发生在面板打开之前,因为点击是异步发生的。也可能是点击实际上没有击中正确的元素(使用 .click 而不是 .trigger,它会告诉您)这可能意味着您需要在驱动程序注册中设置更大的 window_size(window 不够宽,元素相互折叠),或进行其他调试以找出您希望单击的元素未被单击的原因。另一种可能性是 JS 错误 - 确保 js_errors: true 在您的驱动程序注册中设置。还要确保你 运行ning PhantomJS 2.1.1+