capybara - 使用 xPath 查找正在离开范围内 [英] capybara - Find with xPath is leaving the within scope
问题描述
我正在尝试使用默认的 Rails 日期、时间和日期时间字段使用 Capybara 构建日期选择器.我正在使用 within
方法来查找字段的选择框,但是当我使用 xPath 查找正确的框时,它会离开 within
范围并在元素的页面.
I am trying to build a date selector with Capybara using the default Rails date, time, and datetime fields. I am using the within
method to find the select boxes for the field but when I use xPath to find the correct box it leaves the within
scope and find the first occurrence on the page of the element.
这是我正在使用的代码.我正在测试的页面有 2 个日期时间字段,但由于此错误,我只能更改第一个字段.目前我有一个包含日期时间字段的 id 的 div 容器,但我确实计划切换代码以按标签查找.
Here is the code I am using. The page I am testing on has 2 datetime fields but I can only get it to change the first because of this error. At the moment I have an div container with id that wraps up the datetime field but I do plan on switching the code to find by the label.
module Marketron
module DateTime
def select_date(field, options = {})
date_parse = Date.parse(options[:with])
year = date_parse.year.to_s
month = date_parse.strftime('%B')
day = date_parse.day.to_s
within("div##{field}") do
find(:xpath, "//select[contains(@id, "_#{FIELDS[:year]}")]").select(year)
find(:xpath, "//select[contains(@id, "_#{FIELDS[:month]}")]").select(month)
find(:xpath, "//select[contains(@id, "_#{FIELDS[:day]}")]").select(day)
end
end
def select_time(field, options = {})
require "time"
time_parse = Time.parse(options[:with])
hour = time_parse.hour.to_s.rjust(2, '0')
minute = time_parse.min.to_s.rjust(2, '0')
within("div##{field}") do
find(:xpath, "//select[contains(@id, "_#{FIELDS[:hour]}")]").find(:xpath, "option[contains(@value, '#{hour}')]").select_option
find(:xpath, "//select[contains(@id, "_#{FIELDS[:minute]}")]").find(:xpath, "option[contains(@value, '#{minute}')]").select_option
end
end
def select_datetime(field, options = {})
select_date(field, options)
select_time(field, options)
end
private
FIELDS = {year: "1i", month: "2i", day: "3i", hour: "4i", minute: "5i"}
end
end
World(Marketron::DateTime)
推荐答案
您应该在 xpath 中指定要从当前节点开始,方法是在开头添加 .
:
You should specify in the xpath that you want to start with the current node by adding a .
to the start:
find(:xpath, ".//select[contains(@id, "_#{FIELDS[:year]}")]")
示例:
我测试了一个 HTML 页面(希望不要过度简化你的页面):
I tested an HTML page of this (hopefully not over simplifying your page):
<html>
<div id='div1'>
<span class='container'>
<span id='field_01'>field 1</span>
</span>
</div>
<div id='div2'>
<span class='container'>
<span id='field_02'>field 2</span>
</span>
</div>
</html>
使用 inside 方法,您可以在执行此操作时看到您的问题:
Using the within methods, you can see your problem when you do this:
within("div#div1"){ puts find(:xpath, "//span[contains(@id, "field")]").text }
#=> field 1
within("div#div2"){ puts find(:xpath, "//span[contains(@id, "field")]").text }
#=> field 1
但是你可以看到,但是指定 xpath 在当前节点内查看(即使用 .
),你会得到你想要的结果:
But you can see that but specifying the xpath to look within the current node (ie using .
), you get the results you want:
within("div#div1"){ puts find(:xpath, ".//span[contains(@id, "field")]").text }
#=> field 1
within("div#div2"){ puts find(:xpath, ".//span[contains(@id, "field")]").text }
#=> field 2
这篇关于capybara - 使用 xPath 查找正在离开范围内的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!