无法从给定的标签文本定义 siteprism 元素
Unable to define siteprism element from a given label text
我正在使用 cucumber/ruby/capybara/siteprism 框架,我在识别元素时遇到问题,因为我们缺少 ID、名称等,或者他们使用实时创建它们。
我主要是想在 siteprism 页面对象模型中定义其中的一些元素。例如,我试图在下面的 'First Name' 的 'input' 字段中输入一些数据:
<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>
有没有办法把label文本传过去(eg:'First Name' - 忽略周围的空格,类似-contains='First Name')然后找到里面的input元素设置一下?
我在想一些事情:
element :first_name_field, :xpath, "//label[contains(text()='Continue'])/<and here something to find the input field?>" but cannot figure it out...
Capybara 提供了一堆内置的 "selectors" 可用于此,如果您觉得有必要,您可以添加自己的。您可以通过自己构建 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"
如果你想让它可重复使用,你可以添加你自己的 "selector" like
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'
我正在使用 cucumber/ruby/capybara/siteprism 框架,我在识别元素时遇到问题,因为我们缺少 ID、名称等,或者他们使用实时创建它们。
我主要是想在 siteprism 页面对象模型中定义其中的一些元素。例如,我试图在下面的 'First Name' 的 'input' 字段中输入一些数据:
<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>
有没有办法把label文本传过去(eg:'First Name' - 忽略周围的空格,类似-contains='First Name')然后找到里面的input元素设置一下?
我在想一些事情:
element :first_name_field, :xpath, "//label[contains(text()='Continue'])/<and here something to find the input field?>" but cannot figure it out...
Capybara 提供了一堆内置的 "selectors" 可用于此,如果您觉得有必要,您可以添加自己的。您可以通过自己构建 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"
如果你想让它可重复使用,你可以添加你自己的 "selector" like
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'