在我的应用程序的验收测试中,我需要根据列标题匹配表格单元格,同时考虑标题和表格单元格上的colspan
属性。我想编写一个自定义匹配器来执行此操作,但在我看来,XPath并不适合这项工作。 (当然,也许在XPath中可以做这样的事情,但在我看来,像这样的怪物XPath表达式很容易编写,读取或维护。)
所以我想做的是编写一个自定义的Capybara选择器,它不依赖于xpath
中定义的css
或Capybara::Selector
DSL方法。相反,我想使用纯Ruby代码,因为我相信Ruby比XPath更适合这个问题。我该怎么做呢? (例如,我可以创建自己的选择器对象并将其附加到Capybara::Selector.all
或其他内容吗?)
(从Capybara mailing list交叉发布)
TL; DR:
如何定义自己的Capybara匹配器而不限于使用XPath或CSS? XPath在大多数情况下都很好,但是现在我需要更强大的功能。
答案 0 :(得分:0)
我认为这是不可能的。 Capybara仅支持底层驱动程序支持的定位器类型。
Selenium Webdriver supports XPath, CSS, class name, id, name, link text, partial link text, tag name locator types。其他司机的选择次数较少。
Capybara代码选择器块中的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。例如,它不支持上面代码段中使用的count()
函数。您可以自己添加对它的支持。
使用xpath gem编写的Ruby代码也将大于所需的XPath表达式字符串。
答案 1 :(得分:0)
对于将来看这个的人来说,我的最终解决方案是编写一个简单的Ruby类,用于通过Capybara的API解析和处理HTML表。不幸的是,这样的解决方案没有利用Capybara的同步功能,也没有与Capybara现有的API融合,但它对我来说效果很好。