使用Watir验证html中是否存在strike标记

时间:2012-10-17 18:23:03

标签: ruby xpath watir

我有下面的html代码,我正在使用watir来验证March没有一个打击标记,四月,六月和七月确实有打击标记。我非常确定xpath是我答案的关键,但未能提出正确的解决方案。任何帮助是极大的赞赏。

<div class="availability">
Available:
    <ul>
     <li><span class="month available">March</span></li>
     <li><span class="month unavailable"><strike>April</strike></span></li>
     <li><span class="month unavailable"><strike>May</strike></span></li>
     <li><span class="month unavailable"><strike>June</strike></span></li>
    </ul>
</div>

2 个答案:

答案 0 :(得分:0)

使用(假设初始上下文节点是div元素的父级)

div/ul/li/span[not(strike)]

这会选择没有span孩子的任何strike个元素(并且是li的孩子,该孩子是ul的孩子div的子节点,它是初始上下文节点的子节点)

并使用

div/ul/li/span[strike]

这会选择spanstrike个子元素(并且是li的子元素,该元素是ul的子元素。 div,它是初始上下文节点的子节点)

基于XSLT的验证

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select="div/ul/li/span[not(strike)]"/>
==============  
     <xsl:copy-of select="div/ul/li/span[strike]"/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档时:

<div class="availability">
Available:
    <ul>
     <li><span class="month available">March</span></li>
     <li><span class="month unavailable"><strike>April</strike></span></li>
     <li><span class="month unavailable"><strike>May</strike></span></li>
     <li><span class="month unavailable"><strike>June</strike></span></li>
    </ul>
</div>

评估两个XPath表达式,并将结果(选定节点)复制到输出,由一个视觉上与众不同的分隔符字符串分隔:

<span class="month available">March</span>
==============  
<span class="month unavailable">
   <strike>April</strike>
</span>
<span class="month unavailable">
   <strike>May</strike>
</span>
<span class="month unavailable">
   <strike>June</strike>
</span>

答案 1 :(得分:0)

如果您使用的是watir-webdriver,则可以执行以下操作:

#Create an array of the strike elements
months_with_strike = browser.elements(:tag_name, 'strike').collect(&:text)

#Determine if the specified month is in the array
months_with_strike.include?('March')
#=> false
months_with_strike.include?('April')
#=> true

或者,如果您只想检查单个元素:

browser.element(:tag_name => 'strike', :text => 'March').exists?
#=> false
browser.element(:tag_name => 'strike', :text => 'April').exists?
#=> true

重要的是,您可以使用:tag_name作为定位器来获取自定义元素。

注意:我认为这也应该适用于watir-classic,但出于某种原因我会遇到异常。