首页 文章

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

提问于
浏览
2

我正在尝试找到一个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 回答

  • 1

    在我的问题中,我有一个产品列表,其中由一个独特的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']
    
  • 0

    这个 XPath 表达式:

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

    Note :如果您知道自己的架构,请不要使用启动 // 运算符 . 使用字符串值而不是文本节点(这样您就可以获得所有后代文本节点的串联) .

  • 3

    几个路径可以与|组合分隔器 . 调整一下:

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

    你可能想用

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

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

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

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

  • 0

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

    我有一张表[name | Value ]细胞 . 我需要从前面带有'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“

    我认为这种任务可能是一个常见的情况,所以我在这里发布它

相关问题