黄瓜Xpath选择器

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出了点问题。任何帮助将非常感激。

Jon*_*n M 5

当我做过类似的事情时,我使用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)