Selenium,xpath匹配包含多个元素的表行

时间:2010-10-27 20:11:03

标签: php selenium xpath html-table row

我正在尝试找到一个Selenium / PHP XPath来匹配包含多个元素(文本和表单元素)的表行。

示例:

<table class="foo">
  <tr>
    <td>Car</td><td>123</td><td><input type="submit" name="s1" value="go"></td>
  </tr>
</table>

这适用于单个文本元素:

$this->isElementPresent( "//table/tbody/tr/td[contains(text(), 'Car')]" );

虽然没有(省略/ td定位器):

$this->isElementPresent( "//table/tbody/tr[contains(text(), 'Car')]" );

因此,这显然不适用于多个元素:

$this->isElementPresent( "//table/tbody/tr[contains(text(), 'Car')][contains(text(), '123')]" );

另一种方法是使用getTable( "xpath=//table[@class='foo'].x.y")表示每行x,列y。很麻烦,但它很有用......它不会返回<input>标记!它将为该单元格返回一个空字符串:(

有什么想法吗?

5 个答案:

答案 0 :(得分:3)

XPath表达式:

/html/body/table[descendant::td[contains(.,'Car')]]

注意 :如果您了解架构,请不要使用启动//运算符。使用字符串值而不是文本节点(这样就可以得到所有后代文本节点的串联)。

答案 1 :(得分:2)

可以将多个路径与|组合使用分隔器。 调整一下:

//tr/td[contains(text(), 'Car')]/text()  | //tr/td/input[@value="s1"]/@name

答案 2 :(得分:1)

您可能想要使用

// td [contains,'Car']和td [contains,'123'] / ancestor :: tr

将选择包含与两个包含参数匹配的td的tr

尝试在firefox中使用View Xpath Plugin,非常有用的插件。

了解有关Xpath中Axes的更多信息:http://www.w3schools.com/xpath/xpath_axes.asp

答案 3 :(得分:0)

感谢knb提供了一些语法提示。 这有点偏离主题,但与导致我在这里的搜索相关......

我有一张表[name |价值]细胞。我需要从前面带有'name'的行中获取值。

(假的例子,但我寻找的每个链接都有相同的文本,没有ID - 关键是上下文信息在相邻的单元格中)

<table id="options"><tbody>
<tr>
 <td>other</td>
 <td><a href="#clicky">edit</a></td>
</tr>
<tr>
 <td>this label</td>
 <td><a href="#clicky">edit</a></td> <!-- I want this button -->
</tr>
<tr>
 <td>other</td>
 <td><a href="#clicky">edit</a></td>
</tr>
</tbody></table>

我可以使用嵌套的[[]]条件检索我想要的按钮:

//table[@id='options']/tbody/tr[td[contains(text(), 'this label')]]/td[2]/a

“获取”a“,其中包含另一个包含我正在寻找的文本的单元格”

我认为这种任务可能是一种常见的情况,因此我将其发布在FYI

答案 4 :(得分:0)

在我的问题中,我有一个产品列表,它由唯一的SKU /目录组合识别。如果我想将该产品添加到购物车中,我会通过SKU和目录选择它。

使用foob.ar的例子:

//table[@class='foo']/tr[td[contains(text(), 'Car')] and td[contains(., '123')]]

您可以将其与dman的解决方案结合使用,以选择该行中的特定元素/列

//table[@class='foo']/tr[td[contains(text(), 'Car')] and td[contains(., '123')]]//input[@name='s1']

编辑:

如果我只在任何列中查找这两个值,则上述解决方案有效。如果要查找相对于特定列的值,我必须稍微修改一下

//table[@class='foo']/tr[td[position()=1 and contains(text(), 'Car')] and td[position()=2 and contains(text(), '123')]]//input[@name='s1']