无法从给定的标签文本定义siteprism元素

时间:2016-12-01 12:03:16

标签: capybara site-prism

我正在使用黄瓜/ ruby​​ / capybara / siteprism框架,我在识别元素时遇到问题,要么我们缺少ID,名称等,要么他们实时创建它们。

我主要是尝试在siteprism页面对象模型中定义其中的一些元素。例如,我试图在“输入”字段中为“名字”输入一些数据:

<div class="control-group">
<label class="control-label" for="input_field_dec_<random_number>">
First Name
<span class="required"></span>
</label>
<div class="controls">
<input id="input_field_dec_<random_number>" class=" span5" type="text" value="" scripttofire="SetUserFirstName('input_field_dec_<random_number>')" required="required" name="input_field_dec_<random_number>" data-val-required="First Name is required" data-val-regex-pattern="^[a-zA-Z0-9_ \-\']*$" data-val-regex="Only alphabetic and numeric characters allowed" data-val="true">
<span class="field-validation-valid help-inline" data-valmsg-for="input_field_dec_<random_number>" data-valmsg-replace="true"></span>
</div>
</div>

有没有办法传递标签文本(例如:'First Name' - 忽略周围的空格,比如 - contains ='First Name')然后在里面找到输入元素来设置它?

我正在思考以下几点:

element :first_name_field, :xpath, "//label[contains(text()='Continue'])/<and here something to find the input field?>" but cannot figure it out... 

1 个答案:

答案 0 :(得分:3)

Capybara提供了一系列可用于此的内置“选择器”,如果您认为有必要,可以添加自己的“选择器”。您可以通过自己构建Capybara文档来查看提供的选择器(rubydocs不会运行用于生成文档部分的自定义码数),也可以通过浏览文件的实现位置来显示 - https://github.com/teamcapybara/capybara/blob/master/lib/capybara/selector.rb#L47

对于原始示例,您可以使用:field selector

element :first_name_field, :field, 'First Name'

将匹配输入关联的标签文本。对于第二个示例(来自注释),输入和标签没有连接(包装或for属性),您应该可以执行类似

的操作
element :some_field, :xpath, ".//label[contains(normalize-space(string(.)), 'label text')]/following-sibling::*[1]/self::input"

如果你想让它可以重复使用,你可以添加自己的“选择器”,如

Capybara.add_selector(:sibling_input) do
  label "Label adjacent sibling input"
  xpath do |locator|
    XPath.descendant(:label)[XPath.string.n.is(locator)].next_sibling(:input)
  end
end

然后可以用作

element :some_field, :sibling_input, 'label text'