使用CSSSelector匹配元素/包含

时间:2012-12-10 22:15:17

标签: html css css-selectors webdriver selenium-webdriver

我有很长的页面,我提取了与我的问题相关的tr和td。

<tr>
<td colspan="2"><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$dv$ctl01','')">Save</a>&nbsp;<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$dv','Cancel$-1')">Back</a></td>
</tr>
<tr>
.............
.............
</tr>
<tr>
<td colspan="2"><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$dv$ctl08','')">Save</a>&nbsp;<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$dv','Cancel$-1')">Back</a></td>
</tr>
table#ctl00_ContentPlaceHolder1_.DetailsView tbody tr td a

获取4个匹配元素

如何只选择具有"Save"

的元素

我尝试过这样的事情:

table#ctl00_ContentPlaceHolder1_.DetailsView tbody tr td a:contains('Save')

不起作用

3 个答案:

答案 0 :(得分:2)

:contains伪选择器不属于CSS选择器标准的任何级别。因此,By.cssSelector不支持它,因此您不能使用vanilla CSS选择器来执行此操作。您还可以尝试其他一些选项。

  • 您可以遍历findElements返回的元素,获取每个元素的文本,并在找到所需的元素时突破循环。
  • 您可以使用XPath而不是CSS选择器。
  • 您可以创建自己的By类的子类,该类使用Sizzle JavaScript CSS选择器引擎(通常错误地称为“jQuery CSS选择器引擎”)来使用Sizzle引擎来查找元素,因为Sizzle实现了非标准的psuedoselector。

答案 1 :(得分:0)

我使用你提供的东西建立了一个小测试,并填写我认为你所提供的东西以外的东西,并且它正在发挥作用。

<html>
<head>
  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-    ui.css" rel="stylesheet" type="text/css"/>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js">           
  </script>
  <script>

    $(document).ready(function() {
      $("#contentTable.tableClass tbody tr td a:contains('Save')").css("border", "2px     dotted blue");

    });
  </script>
</head>
<body style="font-size:62.5%;">

<table id="contentTable" class="tableClass">

  <tbody>
    <tr>
      <td colspan="2"><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$dv$ctl01','')">Save</a>&nbsp;<a    href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$dv','Cancel$-1')">Back    </a>
      </td>
    </tr>
    <tr>
      <td colspan="2"><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$dv$ctl08','')">Save</a>&nbsp;<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$dv','Cancel$-1')">Back     </a>
      </td>
    </tr>
  </tbody>

</table>

</body>
</html>

我已经简化了你的表id和类值,但我认为你的选择器应该正常工作。选择这些元素后,您要对这些元素做什么?

答案 2 :(得分:0)

如果它们始终是您代码的第一个元素,那么您可以使用:first-child

table#ctl00_ContentPlaceHolder1_.DetailsView tbody tr td a:first-child

xpath方式是

table#ctl00_ContentPlaceHolder1_.DetailsView tbody tr td a[text()='Save']

否则如CSS selector based on element text?中所述,没有CSS方法根据文本来定位元素..