黄瓜Xpath选择器

时间:2011-11-29 08:15:21

标签: ruby-on-rails xpath 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>

基本上,有一些功能,每个功能都有一个“立即尝试”链接。我想测试点击链接是否会将我带到相应功能的页面。

我找到了一个simalar步骤实现here,但是XPATH有问题。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:5)

当我以前做过类似的事情时,我已经使用XPath来找到'标识符'元素 - 在您的情况下,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

您可能需要添加额外的过滤功能,以便它只能找到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

答案 1 :(得分:0)

如果您的xpath基于您提供的链接,则可能会获得一系列元素。因此,它不仅仅是一个链接,而是获得一组链接。尝试抓住其中一个链接(如集合中的第一个链接)并使用它。