如何使用 Capybara 2.0 测试页面标题?

2023-12-07

尝试测试该页面包含<title>My Title</title> with:

# spec/features/reports_spec.rb
require 'spec_helper'

feature "Archive Management" do
  subject { page }

  describe "Index Page" do
    before(:all) { 10.times { FactoryGirl.create(:randomreport) } }
    after(:all) { Report.delete_all }

    describe "when no search terms present" do
      before { visit reports_path }

      it { should have_selector('title', text: 'My Title') } # <= Fails w/Capybara 2.0
      it { should have_selector('title') }                   # <= passes
      it { should have_text('My Title') }                    # <= passes
      it { should have_selector('h2', text: "Welcome") }     # <= passes
    end
  end
end

错误信息:

 Failure/Error: it { should have_selector('title', text: base_title) }
 Capybara::ExpectationNotMet:
   expected to find css "title" with text "My Title" but there were no matches. Also found "", which matched the selector but not all filters.

我知道我忽略了明显的痛苦,但无法弄清楚它是什么?是<title>标签不再被视为“选择器”?!?或者...?!?

编辑(调试器信息):

如果我按照 @shioyama 巧妙的建议进入调试器,很明显 page.body 包含<title>My Title</title>。包含相同的 page.body<h2>Welcome to My Title Project</h2>并通过!

看来找到了<title>...</title>标记但不My Title在其中。但它确实发现My Title稍后在页面内<a href=\"/\" class=\"brand\">My Title</a>和/或在<h2>Welcome to The My Title Project</h2>:

(rdb:1) p page
#<Capybara::Session>
(rdb:1) p page.body
"<!DOCTYPE html>\n<html>\n<head>\n<title>My Title</title>\n
<meta content='research, report, technology' name='keywords'>\n<meta 
content='Some Project' name='description'>\n<link href=\"/assets/application.css\"
...
</head>\n<body>\n<header class='navbar navbar-fixed-top 
navbar-inverse'>\n<div class='navbar-inner'>\n<div class='container'>\n
<a href=\"/\" class=\"brand\">My Title</a>\n<div class='pull-right'>\n
<ul class='nav'>\n<li><a href=\"/about\">About</a></li>\n<li><a href=\"/help\">Help</a>
</li>\n</ul>\n<form accept-charset=\"UTF-8\" action=\"/reports\" 
class=\"navbar-search\" method=\"get\"><div style=\"margin:0;padding:0;display:inline\">
<input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /></div>\n
<input class=\"search-query\" id=\"query\" name=\"query\" 
placeholder=\"Search\" type=\"text\" />\n</form>\n\n</div>\n</div>\n</div>\n</header>\n\n
<div class='container'>\n<div class='hero-unit center'>\n<h1>My Title</h1>\n
<h2>Welcome to The My Title Project</h2>\n<p>Lorem ipsum dolor sit amet, consectetur 
adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
...

我还可以在调试器中尝试什么来找出 has_selector?('title', text: ...) 失败的原因?

那么,在 Capybara 2.0 中测试标题的正确方法是什么?


当我升级到 Capybara 2.0 时,我遇到了同样的问题,并通过使用创建以下自定义 RSpec 匹配器来解决这些问题Capybara.string:

规范/支持/utilities.rb

RSpec::Matchers::define :have_title do |text|
  match do |page|
    Capybara.string(page.body).has_selector?('title', text: text)
  end
end

现在,在规范文件中subject { page }, 我可以用:

it { should have_title("My Title") }
it { should_not have_title("My Title") }

顺便说一句,关于这个问题的对话对我找到这个答案非常有帮助,所以谢谢!

更新1:

如果您不想创建自定义 RSpec 匹配器,感谢这个 StackOverflow 答案按用户dimuch我现在知道你可以打电话have_selector直接在page.source(别名page.body) 测试不可见的 DOM 元素:

it "should show the correct title" do
  page.source.should have_selector('title', text: 'My Title')
end

或在哪里subject { page }:

its(:source) { should have_selector('title', text: 'My Title') }

更新2:

从Capybara 2.1开始,内置了have_title/has_title?匹配器,在这个答案中不需要自定义 RSpec 匹配器。此外,its(:source) { ... }Update 1 中描述的测试似乎在 Capybara 2.1 下失败;我已经确认了have_title/has_title?按预期工作,因此如果您计划升级,最好使用以下语法:

When subject { page }:

it { should have_title("My Title") }
it { should_not have_title("My Title") }

使用时expect语法内it/scenario block:

expect(page).to have_title("My Title")
expect(page).to_not have_title("My Title")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Capybara 2.0 测试页面标题? 的相关文章

随机推荐

  • .NET Reactive Framework 的良好介绍[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 除了 Microsoft 文档之外 是否有关于 Microsoft Reactive Rx 框架的良好介绍和教程 另外 反应式使使用传统异步编码技术难以解决的编程问题变得更容易的一个
  • 自动为 Qt 配置套件

    SO 假设我对 QtCreator 中的新套件有许多设置 GCC 编译器 9 3 0 从源代码构建 因为我必须使用的发行版有一个非常旧的版本 以及环境设置 我已经成功地设置了一个用于编译和执行已编译二进制文件的环境 并制作了一个脚本以使其工
  • 如何在 devstack 中管理用户/密码?

    我已经安装了devstack到一个干净的 Ubuntu 机器 我可以访问 OpenStack 仪表板 http localhost auth login 但是 我不知道如何管理用户或我的初始凭据是什么 此信息保存在哪里 该信息保存在 Key
  • SQLAlchemy与association_proxy的关系问题

    我一直在浏览许多网站 试图了解正在发生的事情 但我确实需要一些直接的帮助 如果我错过了文档中明显的内容 我很抱歉 这就是我想要做的 我已经删除了除了基本代码之外的所有内容 Base declarative base class User B
  • 使用默认文本填充 FILE 字段

    我正在尝试重新利用生成 FILE 字段的代码 以便在将某些内容添加到数据库时使用 并在编辑或详细查看相关项目时使数据库中已有的数据变灰 并禁用 但是 我似乎无法让文本填充该字段 我正在使用这个 echo
  • 如何在oracle中创建具有动态列名和动态数据类型的动态表,无需任何视图或任何其他表类型

    谢谢大家 我们可以在以下的帮助下动态创建一个表execute immediate询问 但是 当我们创建一个表时 它已经创建了 但是如果我想动态创建具有动态列数的表 那么就会出现问题 实际上我已经创建了一个表 但是当我没有随表创建任何列时 会
  • 用于查找、搜索和替换文件中字符串数组的 Shell 脚本

    这与我问的另一个问题 代码高尔夫有关Code Golf 重复文本的 颜色突出显示 我有一个包含以下内容的文件 sample1 txt LoremIpsumissimplydummytextoftheprintingandtypesettin
  • 如何选择合适的距离函数

    这可能是一个微不足道的问题 对于特殊的高维数据集 如何选择一个好的距离函数 我读到一些距离函数 例如欧几里得距离 在高维数据中效果不佳 如果这不能为我们提供良好的距离测量 那么什么函数可以呢 它来自维度的诅咒 基本上是随着维度的增加 空间呈
  • 在 BASH 中向特定日期添加 X 天

    BASH 完全陌生 提前致歉 Problem 我想在特定日期添加 X 天 Code 我发现date在 BASH 中检索当前日期 我还发现可以通过以下方式将 X 天添加到当前日期 expiration date date v 1d 这使 Tu
  • 如何使两个div的高度彼此相等?

    这里我在类行中有两个引导面板 我试图使两个面板的高度彼此相等 即使在面板内放置了任何数量的数据 div class panel body div 任何面板 下面是我的html div class row div class col md 6
  • 如何防止 vim 创建(和留下)临时文件?

    vim 为什么要创建
  • 解析错误:语法错误,意外的 T_ENCAPSED_AND_WHITESPACE

    我可能有语法错误或其他错误 但我什么也没看到
  • 如何在 Woocommerce 中动态更改 PayPal 地址?

    我正在尝试更改 Woocommerce 使用的 PayPal 地址 具体取决于它们所在的页面 我目前只有 5 个产品 所有 5 个产品都需要使用不同的 PayPal 地址 我发现这个钩子可以更改 Paypal 地址 尽管不太确定如何准确添加
  • 如何在不使用在线服务的情况下使用 Ruby 检测用户的输入语言?

    我正在寻找一个库或技术来检测用户提供的文本块的输入语言 在线查找 如谷歌翻译 不适用于此任务 因为我正在编写一个必须离线运行的应用程序 Thanks 这里还有两个n gram您可能想尝试的基于宝石 他们离线工作 https github c
  • 在一个应用程序中使用多个数据库

    我有一个为几组彼此不相关的人制作的网络应用程序 我正在考虑创建单独的数据库 而不是为所有这些数据库使用一个数据库 这将提高查询速度 并使我无需检查用户属于哪个组 但由于我正在使用 LINQ to SQL 我的类与数据库显式连接 因此我必须单
  • 使用 double、OpenCL 进行原子操作

    我想知道是否有一种方法可以用 double 类型实现原子操作 特别是atomic add 对于浮点数 此代码有效 但是原子xchg不支持双倍 while value atomic xchg addr atomic xchg addr 0 0
  • 根据 Woocommerce 中的购物车商品高度添加费用

    我正在尝试找到一个功能 如果购物车中的产品高度超过 2 9 厘米 则会自动向购物车添加费用 我正在将 Woocommerce 用于我们简单的非营利漫画书店 在瑞典 我们使用基于重量的运输作为标准 如果物品尺寸为 3 厘米或以上 则会收取大件
  • 调用验证器但不显示错误消息

    当我单击命令按钮时 验证方法被调用但错误消息没有显示 这是我的代码
  • 如何使用 AJAX 从 PHP 函数获取 true 或 false?

    我测试过状态 php使用 var dump result 返回值并在 check 函数中提醒它 如下所示 function check ajax url status php done function data alert data 它确
  • 如何使用 Capybara 2.0 测试页面标题?

    尝试测试该页面包含 with spec features reports spec rb require spec helper feature Archive Management do subject page describe Ind