2011-11-29 75 views
1

我在下面的HTML中尝试用黄瓜测试一个页面。黄瓜Xpath选择器

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

+0

是否有可能修改您的HTML使它更有语义?例如为每个包含特征名称的'li'添加一个类或ID?用XPath做到这一点绝对有可能 - 我最近做到了,并且会为你挖出来 - 但它并不漂亮! –

回答

4

当我做了类似的事情之前,我已经使用XPath来定位'标识符'元素 - 在您的情况下,p标签包含例如'特征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 
+0

谢谢!这工作。不幸的是,我指望触摸html,我所能做的就是编写步骤:) – zsquare

+0

另一个问题,说我想在文本和链接的父级范围内做一些其他的事情,任何想法如何选择相关的父母? – zsquare

+0

我想你可以抓住整个父(通过剥离XPath的“后代”部分)并将它传递给一个'within'块,就像'within(:xpath,“// p [contains(。, '#{feature_name}')]/ancestor :: li“){#在这里做事}' –

0

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