zsq*_*are 1 xpath ruby-on-rails cucumber
我要在黄瓜上测试的页面上有以下HTML。
<div class='try_options'>
<ul>
<li>
<div>
<img alt="" src="/images/main_page1.jpg" />
<div class='right_section'>
<p>
Feature 1
</p>
<a class='suggest_btn' href='url1'>Try Now</a>
</div>
</div>
</li>
<li>
<div>
<img alt="" src="/images/main_page2.jpg" />
<div class='right_section'>
<p>
Feature 2
</p>
<a class='suggest_btn' href='url2'>Try Now</a>
</div>
</div>
</li>
<li>
<div>
<img alt="" src="/images/main_page3.jpg" />
<div class='right_section'>
<p>
Feature 3
</p>
<a class='suggest_btn' href='url3'>Try Now</a>
</div>
</div>
</li>
<li>
<div>
<img alt="" src="/images/main_page4.jpg" />
<div class='right_section'>
<p>
Feature 4
</p>
<a class='suggest_btn' href='url4'>Try Now</a>
</div>
</div>
</li>
</ul>
</div>
Run Code Online (Sandbox Code Playgroud)
基本上,有一些功能,每个功能都有一个“立即尝试”链接。我想测试单击链接是否将我带到相应功能的页面。
我在这里找到了一个标准的步骤实现,但是XPATH出了点问题。任何帮助将非常感激。
当我做过类似的事情时,我使用XPath来定位'identifier'元素-在您的情况下,该p标签包含例如'Feature 1',然后将DOM向上移到一个公共父级(li此处),然后再次向下移查找我追随的兄弟姐妹(例如与关联的链接p)。这可能对您有用:
def find_link_for_feature(feature_name)
find(:xpath, "//p[contains(.,'#{feature_name}')]/ancestor::li/descendant::a")
end
find_link_for_feature('Feature 1').click
Run Code Online (Sandbox Code Playgroud)
您可能需要添加额外的筛选,以便仅suggest_btn根据您的情况查找与类的链接。
但是,正如我在对问题的评论中提到的那样,我更喜欢修改标记,以使它实际上是可测试的,而不必跳过诸如此类的篮球!当我无法修改标记时,我认为这种XPath是不得已的方法。
编辑:
考虑一下您的询问,询问如何在父元素的范围内做其他事情,我很想做类似以下的事情,它为您提供了更大的灵活性,并略微减少了丑陋的XPath:
def find_section_for_feature(feature_name)
find(:xpath, "//p[contains(.,'#{feature_name}')]/ancestor::li")
end
within find_section_for_feature('Feature 1') do
click_link 'Try Now'
# Anything else you want to do
and
Run Code Online (Sandbox Code Playgroud)