我正在尝试找到一个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>
标记!它将为该单元格返回一个空字符串:(
有什么想法吗?
答案 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']