【问题标题】:How do I write a custom Capybara Selector with pure Ruby (No XPath/CSS)如何使用纯 Ruby(无 XPath/CSS)编写自定义 Capybara 选择器
【发布时间】:2014-01-15 17:59:42
【问题描述】:

在我的应用程序的验收测试中,我需要根据列标题匹配表格单元格,同时考虑到标题和表格单元格上的 colspan 属性。我想编写一个自定义匹配器来执行此操作,但在我看来,XPath 并不适合这项工作。 (当然,也许可以在 XPath 中做这样的事情,但在我看来,这样一个怪物 XPath 表达式并不容易编写、阅读或维护。)

所以我想做的是编写一个不依赖于Capybara::Selector 中定义的xpathcss DSL 方法的自定义Capybara 选择器。相反,我想为此使用纯 Ruby 代码,因为我相信 Ruby 比 XPath 更适合这个问题。我该怎么做呢? (例如,我可以创建自己的选择器对象并将其附加到 Capybara::Selector.all 或其他东西吗?)

(来自Capybara mailing list的交叉发布)


TL;DR:

如何定义我自己的 Capybara 匹配器而不限于使用 XPath 或 CSS? XPath 在大多数情况下都很好,但现在我需要更强大的东西。

【问题讨论】:

  • 请举一个方法签名的例子。
  • @AndreyBotalov 什么方法签名? Capybara finder 方法的签名?我希望能够像任何其他 Capybara 选择器一样使用它:page.all(:table_cell, "Column Header")

标签: capybara


【解决方案1】:

我认为这是不可能的。 Capybara 仅支持底层驱动支持的定位器类型。

Selenium Webdriver supports XPath, CSS, class name, id, name, link text, partial link text, tag name locator types。其他司机的选择较少。

Capybara 代码选择器块中的As you see 应返回单个 XPath 或 CSS 表达式。

CSS 定位器不允许通过文本定位元素。所以你应该使用 XPath。您可以执行以下操作以按列名定位表格单元格:

Capybara.add_selector(:table_cell) do
  xpath { |column_name| "//td[1 + count(//th[.='#{column_name}']/preceding-sibling::th)]" }
end
page.all(:table_cell, 'Column Header')

您还可以使用 xpath gem 在 Ruby 中编写 XPathes。

但 xpath gem 目前不支持所有XPath functions。例如它不支持上面 sn-p 中使用的count() 函数。您可以自己在那里添加对它的支持。

此外,您将使用 xpath gem 编写的 Ruby 代码将大于所需的 XPath 表达式字符串。

【讨论】:

  • 是的,不幸的是,我的问题的 XPath 解决方案会比这复杂得多。正如我在最初的问题中所说,我需要一个考虑到colspan 的问题。我认为你是对的,我想要的东西是不可能的。我看了一点 Capybara 的源代码,在我看来,驱动程序本身就是需要使用 XPath 的。
【解决方案2】:

对于将来看到这个的任何人,我的最终解决方案是编写一个普通的旧 Ruby 类,用于通过 Capybara 的 API 解析和处理 HTML 表。不幸的是,这样的解决方案没有利用 Capybara 的同步功能,也没有与 Capybara 现有的 API 融合,但它对我来说已经足够好了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    相关资源
    最近更新 更多