草庐IT

html - capybara 不会通过其 "name"属性找到按钮

coder 2023-08-04 原文

经过 W3C 验证的 HTML 5 网页在登录表单中包含这个有效、简单的按钮。

<input data-disable-with="Signing in, please wait&amp;hellip;"
       name="commit" type="submit" value="Sign in" />

我正在 Rails 3.2.17 应用程序中编写一个基本上没有意义的测试 :-) 只是为了掌握 Capybara 的窍门,我已经完全陷入了谷歌搜索、阅读文档和阅读测试框架源代码的困境,没有喜悦 - 试图通过其 name(即 “commit”)找到此按钮失败。

click_button("commit")
find_button("commit")

两者都会导致 Capybara::ElementNotFound:无法找到按钮“提交”。如果我使用 Sign in 的可见按钮文本,则会找到元素,即这些:

click_button("Sign in")
find_button("Sign in")

...两者都工作正常,因此看起来 XML 解析器在查找元素时没有遇到任何问题。

click_button 的文档说定位器适用于“id、文本或值”,“文本”对于这样的 input 元素没有意义(可见文本取自 value 属性),但可能与 button 元素相关。因此,我们可能希望它失败,但如果我们通过文档查看代码,会发现它以与 find_button 相同的方式向下调用 find。然而 find_button 的文档有所不同;它说它按“id、名称或值”定位。很遗憾,我们从中得知文档已损坏,因为它说了两件不同的事情,结果证明在后端是相同的调用。

无论哪种方式,都无法通过名称找到该元素,这意味着据我所知,较低级别的 find 调用并未搜索 name 属性。这意味着 Capybara(2.2.1,在 Nokogiri 1.6.1 上)在这方面相当糟糕。怎么没人注意到?我已经用谷歌搜索了很久,但似乎没有出现。我似乎错过了重点:-)

您可能会问,为什么我不直接搜索按钮中的英文文本?因为国际化。这个旧的 Rails 1 -> 2 -> 3 升级应用程序有一些 I18n 部分和其他静态文本部分。我不想被迫将 I18n 放入 Capybara 测试的任何 View 中,这样我就可以让测试使用 I18n.t() 来确保匹配,尽管有不同的语言或区域设置文件更新。同样,在 2014 年将硬编码的英文字符串写入我的测试中显然是非常愚蠢的。

这就是为什么我们有名称和 ID 等等......唯一的(理论上!)机器读取的标识符,而不是人类读取的。

我可以破解一些由“type=submit”选择的 CSS,但说真的,为什么 Capybara 不搜索 name 属性,而它的文档说它搜索,为什么文档不同意在两个上搜索什么属性使用完全相同的参数调用完全相同的后端实现的方法?

TIA:)

最佳答案

事实证明,文档对这两个调用都有误导性,因为它们都没有查看列出的属性。显然,“按钮”的确切含义也很令人困惑,因为这里的一些人似乎认为它的字面意思只是 HTML button。元素,但事实并非如此。

如果您查看文档的来源,例如 click_button :

https://github.com/jnicklas/capybara/blob/a94dfbc4d07dcfe53bbea334f7f47f584737a0c0/lib/capybara/node/actions.rb#L36

...你会看到这只是调用(正如我在其他地方提到的)find类型为 :button , 依次传递给 capybara 的 Query引擎,反过来,最终只是使用标准的内部选择机制来查找东西。它非常优雅;就像外部客户可以添加他们自己的自定义选择器以更方便地查找东西一样:

http://rubydoc.info/github/jnicklas/capybara/master/Capybara#add_selector-class_method

...因此 Capybara 在内部添加了自己的选择器,重要的是,包括 :button :

https://github.com/jnicklas/capybara/blob/a94dfbc4d07dcfe53bbea334f7f47f584737a0c0/lib/capybara/selector.rb#L133

这不是通过任何特殊情况魔术完成的,只是一些预定义的自定义选择器。因此,如果您一直想知道 Capybara 中有哪些自定义选择器可用,那就是要阅读的文件(它可能也埋在文档中,但我自己还没有找到该列表)。

在这里,我们看到按钮代码实际上是在调用 XPath::HTML.button ,这是不同存储库中的不同代码块,带有此文档:

http://rdoc.info/github/jnicklas/xpath/XPath/HTML#button-instance_method

...在编写时相对于代码来说有点过时了,因为代码显示了很多被识别的东西,包括 input类型 resetbutton (即 <input type="button"...> 而不是 <button...>...</button> ,尽管后者当然也包括在内)。

https://github.com/jnicklas/xpath/blob/59badfa50d645ac64c70fc6a0c2f7fe826999a1f/lib/xpath/html.rb#L22

我们还可以在这段代码中看到,finder 方法实际上只能通过id 找到。 , value title - 即不是“文本”,也不是名字。

所以假设 XPath 的行为符合预期,虽然从文档中不清楚,但我们可以看到 Capybara 没有正确记录自己,但可能应该链接到 XPath API 以获取更多信息,以避免当前重复信息以及这可能给维护者和 API 客户带来的问题。

与此同时,我已经提交了这个问题:

https://github.com/jnicklas/capybara/issues/1267

关于html - capybara 不会通过其 "name"属性找到按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22371151/

有关html - capybara 不会通过其 "name"属性找到按钮的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  4. ruby-on-rails - Ruby on Rails : . 常量化 : wrong constant name error? - 2

    我正在使用这个:4.times{|i|assert_not_equal("content#{i+2}".constantize,object.first_content)}我之前声明过局部变量content1content2content3content4content5我得到的错误NameError:wrongconstantnamecontent2这个错误是什么意思?我很确定我想要content2=\ 最佳答案 你必须用一个大字母来调用ruby​​常量:Content2而不是content2。Aconstantnamestart

  5. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  6. ruby - capybara field.has_css?匹配器 - 2

    我在MiniTest::Spec和Capybara中使用以下规范:find_field('Email').must_have_css('[autofocus]')检查名为“电子邮件”的字段是否具有autofocus属性。doc说如下:has_css?(path,options={})ChecksifagivenCSSselectorisonthepageorcurrentnode.据我了解,字段“Email”是一个节点,因此调用must_have_css绝对有效!我做错了什么? 最佳答案 通过JonasNicklas得到了答案:No

  7. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  8. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  9. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  10. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

随机推荐