如何通过有条件地排除父母以前的兄弟节点来选择子节点

时间:2014-05-20 19:06:47

标签: html dom testing selenium xpath

我有一个关于在Selenium IDE中使用(对我而言)一些复杂的XPath查询的问题(一般认为它们适用于XPath)。

首先,这是我的情景。

我正在为我正在处理的网站功能编写一些自动化测试,只有网站上出售的某些商品才有。我正在尝试以这样一种方式设计测试,即数据的变化不会破坏它。这是我正在测试的内容的抽象:

给定一组搜索结果,结果中的某些产品将具有一个功能(让我们调用功能属性),我想点击具有单一价格和属性的第一个结果(将来可能会改变)

我正在使用Selenium IDE 2.5.0 / FF 28。

这是我创建的一个JsFiddle,它模拟了我必须使用的标记/ DOM结构(标记无法更改):http://jsfiddle.net/xDaevax/3qUHB/6/

这是我的XPath查询:

//div[contains(@class, 'primary')]//div[contains(@class, 'results')]//div[@class='price-range']/span[not(contains(@class, 'seperate'))]/../../..//a[@class='detail-link']

基本上,问题是:所有三个都有相同的包装标记和css类信息,但由于第二个元素(我之后的那个)没有,它们在价格范围类中有所不同“单独”或“最小”的CSS类元素。

我已经使用XPath选择器做到了这一点,但我被卡住了。我假设当我使用“/../ ..”遍历DOM时,我丢失了之前使用的条件XPath子句。

我为细节的模糊性道歉,但由于合同限制,我尽可能地通用。 如何实现我想要的选择的任何建议将不胜感激。如果我需要澄清我尝试过的任何要求或步骤,请告诉我。

修改 以下是对预期结果的简洁描述。

在给出的标记示例中,我想选择并单击中间结果元素中的链接。这是因为中间元素具有所需的“属性”,一旦点击链接,它将带您进入产品页面,其中包含需要测试的其他内容。话虽这么说,数据可能会改变:今天它是列表中的第二个元素,但也许明天它是16个元素中的第7个元素。

我当前的XPath逻辑(虽然我的解决方案不起作用)如下:我感兴趣的元素可以与其他结果区别开来,因为有两件事:1),它有一个细节超链接(稍后会有)点击)和2)它没有一系列的价格(不像第一个结果)。因为第一个结果也有一个超链接,两者之间的唯一区别是第一个结果具有最小值和分隔符标记元素,而第二个结果没有(我的目标链接将始终具有单个价格而不是范围)。根据这些信息,我尝试编写XPath,它将选择一个未包含在具有价格范围的元素中的第一个超链接。

1 个答案:

答案 0 :(得分:2)

此表达式将选择所有三个div元素:

//div[contains(@class, 'primary')]
   //div[contains(@class, 'results')]
   //div[@class='price-range']

如果我正确理解了您的要求,则price-range div必须有一个<a href>元素的兄弟,因此我们可以通过添加该元素来过滤掉最后一个div谓词中的限制:[../a[@href]]。所以这个表达式只选择前两个div

//div[contains(@class, 'primary')]
   //div[contains(@class, 'results')]
   //div[@class='price-range']
        [../a[@href]]

现在,您可以添加一个谓词来删除不具有单个价格的项目。您选择separate类作为标准,因此我们可以更改最后一个谓词并为其添加另一个限制:[../a[@href] and not(span[contains(@class,'separate')])]。现在,您的表达式会选择您想要的div

//div[contains(@class, 'primary')]
   //div[contains(@class, 'results')]
   //div[@class='price-range']
        [../a[@href] and not(span[contains(@class,'separate')])]

这是一个位置路径,用于创建上下文。在此上下文中,您可以随意导航。您可以让兄弟<a href>使用其相对路径添加新步骤:../a。因此,最后,此表达式选择与div

处于同一级别的链接
//div[contains(@class, 'primary')]
    //div[contains(@class, 'results')]
    //div[@class='price-range']
         [../a[@href] and not(span[contains(@class,'separate')])]
    /../a

或者在一行中:

//div[contains(@class, 'primary')]//div[contains(@class, 'results')]//div[@class='price-range'][../a[@href] and not(span[contains(@class,'separate')])]/../a