警告:无法保存屏幕截图。 page.current_path 为空

WARN: Screenshot could not be saved. page.current_path is empty

我 运行 使用 bundle exec rspec 进行测试,这给了我以下错误:

WARN: Screenshot could not be saved. page.current_path is empty.

也收到此错误:

1) adding a new task can re-order a task
     Failure/Error: expect(page).to have_selector(".name", text: "Take Notes")
       expected to find visible css ".name" with text "Take Notes" within #
<Capybara::Node::Element tag="tr" path="/HTML/BODY[1]/TABLE[1]/TBODY[1]/TR[2]"> but there were
 no matches. Also found "Use Telescope", which matched the selector but not all filters. 

Ruby:2.7.2 Rails: 6.0.3.4

经过如下测试,报错

这是我要测试的测试: /spec/system/add_task_spec.rb

require "rails_helper"

RSpec.describe "adding a new task" do
  let!(:project) { create(:project, name: "Project Bluebook") }
  let!(:task_1) { create(
    :task, project: project, title: "Search Sky", size: 1, project_order: 1) }
  let!(:task_2) { create(
    :task, project: project, title: "Use Telescope", size: 1,
           project_order: 2) }
  let!(:task_3) { create(
    :task, project: project, title: "Take Notes", size: 1,
           project_order: 3) }

  it "can re-order a task", :js do
    visit(project_path(project))
    find("#task_3")
    within("#task_3") do
      click_on("Up")
    end
    expect(page).to have_selector(
      "tbody:nth-child(2) .name", text: "Take Notes")
      #END:P1
      #START:P2
    visit(project_path(project))
    find("#task_2")
    within("#task_2") do
      expect(page).to have_selector(".name", text: "Take Notes")
    end
  end

end

您在尝试截屏时收到关于 page.current_path 不可用的警告可能是因为您的 RSpec after 挂钩安装顺序错误(会话在截屏调用之前被重置)制作)。

至于失败的测试,真的很难说清楚你在做什么,但有很多事情都是潜在的问题

  1. 我假设元素 ID 被命名为 #task_<task project order> 如果不是,而是 #task_<task id> 那么您需要重新考虑如何进行测试

  2. tbody:nth-child(2) 找到作为第二个子元素的 tbody,而不是 tbody 元素的第二个子元素。我猜你想要 tbody tr:nth-child(2) ...

  3. 在执行 within 之前不需要找到元素,因为 within 会找到元素(使用 retry/waiting)

  4. 必须在调用第二个 visit 之前提交新订单的保存 - 希望您对位于不同行中的元素的检查确实表明订单已保存。

应用这 3 个我最终得到

it "can re-order a task", :js do
  visit(project_path(project))
  within("#task_3") do
    click_on("Up")
  end
  expect(page).to have_selector(
    "tbody tr:nth-child(2) .name", text: "Take Notes")
  #END:P1
  #START:P2
  visit(project_path(project))
  within("#task_2") do
    expect(page).to have_selector(".name", text: "Take Notes")
  end
end

如果在那里修复选择器并没有修复你的测试(希望它应该同步浏览器,这样第二次访问不会发生,直到订单被实际更改),那么你需要想出一些可见的东西这实际上表明新订单已保存并在调用第二次访问之前等待。

如果使用相对较新版本的 Capybara,您还可以使用基于位置的过滤器来实际验证我假设您正在寻找的内容(文本的垂直顺序发生变化)- 类似于

notes_row = find('tr', text: 'Take Notes')
expect(page).to have_selector('tr', text: 'Use Telescope', above: notes_row)
notes_row.click_on('Up')
expect(page).to have_selector('tr', text: 'Use Telescope', below: notes_row)

我通过这样更改测试解决了错误:

  it "can re-order a task" do
    visit(project_path(project))
    find("#task_3")
    within("#task_3") do
      click_on("Up")
    end
    
    expect(page).to have_selector("tbody:nth-child(2) .name", text: "Take Notes")
    visit(project_path(project))
    within("#task_2") do
      expect(page).to have_selector(".name", text: "Use Telescope")
    end
  end