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

时间:2016-07-26 06:57:31

标签: ruby-on-rails rspec phantomjs capybara poltergeist

我有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

当我这样做时,我得到:

  

水豚::鬼驱:: MouseEventFailed:          在坐标[83,227]点击点击失败。 Poltergeist用CSS选择器&#h; html检测到另一个元素   body.fixed.index.photos.sidebar-collapse.sidebar-mini.skin黑   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'在这个位置。它   可能与您尝试与之交互的元素重叠。如果你   不要关心重叠元素,尝试使用   node.trigger('单击&#39)。

我尝试将其更改为:

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

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

1 个答案:

答案 0 :(得分:1)

是的,它应该运行JS。如果你真的想要测试你的用户界面是否有效,你也应该拨打.click而不是.trigger('点击')。 trigger('click')绕过检查元素是否实际上是可点击的,因此可以隐藏许多错误。另外first像你一样使用它会绕过水豚的等待行为并导致片状测试,所以你可能想要使用first("img.crazy", minimum: 1)或设置Capybara.wait_on_first_by_default = true。

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