页面对象 gem 没有用于框架/iframe 的嵌套元素方法。您将需要找到一个可以相对于浏览器(或另一个框架/iframe)唯一标识框架/iframe 的定位器。唯一支持与其他元素相对位置的定位器是 :css 和 :xpath。
请注意,页面对象 gem 不包含对框架/iframe 对象的引用(即没有像 Watir 中那样的嵌套元素调用)。相反,框架作为元素定位器的一部分传递。
作为示例,让我们考虑以下 HTML,它添加了(为简洁起见内联)一些框架内容:
<html>
<body>
<div name="first">
<iframe src="frame1.htm">
<html>
<body>
<span>frame1 - span</span>
<input type="text" name="field" value="1" />
</body>
</html>
</iframe>
</div>
<div name="second">
<iframe src="frame2.htm">
<html>
<body>
<span>frame2 - span</span>
<input type="text" name="field" value="2" />
</body>
</html>
</iframe>
</div>
</body>
</html>
根据您与之交互的内容,您可以使用访问器访问 iframe 内容,也可以定义方法。以下页面对象使用访问器方法。请记住将框架定位器传递给每个元素。
class MyPage
include PageObject
# Define elements <div name="first"> iframe
in_iframe(css: 'div[name="first"] iframe') do |f|
span(:first_iframe_span, frame: f)
text_field(:first_iframe_field, frame: f)
end
# Define elements <div name="second"> iframe
in_iframe(css: 'div[name="second"] iframe') do |f|
span(:second_iframe_span, frame: f)
text_field(:second_iframe_field, frame: f)
end
end
您可以看到每个定义的元素都返回来自特定 iframe 的值:
# Elements in the <div name="first"> iframe
p page.first_iframe_span
#=> "frame1 - span"
p page.first_iframe_field
#=> "1"
# Elements in the <div name="second"> iframe
p page.second_iframe_span
#=> "frame2 - span"
p page.second_iframe_field
#=> "2"
您可以使用类似的方法动态访问方法中的元素:
class MyPage
include PageObject
def do_stuff_in_first_iframe
in_iframe(css: 'div[name="first"] iframe') do |f|
p span_element(frame: f).text
p text_field_element(frame: f).value
end
end
def do_stuff_in_second_iframe
in_iframe(css: 'div[name="second"] iframe') do |f|
p span_element(frame: f).text
p text_field_element(frame: f).value
end
end
end
同样,您可以看到您获得了每个 iframe 的值:
page.do_stuff_in_first_iframe
#=> "frame1 - span"
#=> "1"
page.do_stuff_in_second_iframe
#=> "frame2 - span"
#=> "2"