1

我正在使用 cucumber/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... 
4

1 回答 1

3

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

对于您的原始示例,您可以使用 :field 选择器

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'
于 2016-12-01T17:44:50.670 回答