无法找到带有css选择器的元素

时间:2012-09-10 17:30:17

标签: selenium css-selectors webdriver selenium-webdriver

使用Selenium Webdriver使用C#(。Net)进行FF / IE

下面是我的页面源代码,我正在尝试使用CssSelector从我的页面中查找/包含特定名称,我尝试使用以下代码但导致错误,有任何帮助吗?

//代码

driver.FindElement(By.CssSelector("td:contains('John John')"))

//错误:

e {"Unable to find element with css selector == td:contains('John John')"}  System.Exception {OpenQA.Selenium.NoSuchElementException}

//我的HTML代码:

 <div id="ctl00_ContentPlaceHolder1_AddeCardControl1_gv_ctl01_RecordCount" style="float:right; padding-right:10px; margin-top:3px;">
  <b>308</b> Items Found
 </div>
 </td>
</tr>
<tr class="item">
 <td align="center"><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$gv','Select$0')">Edit</a></td>
 <td align="center" style="width:15px;"></td>
 <td>John John</td>
 <td>&nbsp;</td>
 <td>&nbsp;</td>
 <td>&nbsp;</td>
 <td><img src="check.png" alt='Active' style='display: ;' /></td>
 <td>9/7/2012 11:15:08 PM</td>
</tr>
<tr class="altItem">
 <td align="center"><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$gv','Select$1')">Edit</a></td>
 <td align="center" style="width:15px;"></td>
 <td>John Schulz</td>
 <td>&nbsp;</td>
 <td>Visitors</td>
 <td>&nbsp;</td>
 <td><img src="check.png" alt='Active' style='display: ;' /></td>
 <td>9/7/2012 6:28:29 PM</td>
</tr>
<tr class="item">
 <td align="center"><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$gv','Select$2')">Edit</a></td>
 <td align="center" style="width:15px;"></td>
 <td>Parker Smith</td>
 <td>&nbsp;</td>
 <td>Visitors</td>
 <td>&nbsp;</td>
 <td><img src="check.png" alt='Active' style='display: ;' /></td>
 <td>9/7/2012 6:01:28 PM</td>
</tr>
<tr class="altItem">
 <td align="center"><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$gv','Select$3')">Edit</a></td>
 <td align="center" style="width:15px;"></td>
 <td>Test 123</td>
 <td>&nbsp;</td>
 <td>Visitors</td>
 <td>&nbsp;</td>
 <td><img src="check.png" alt='Active' style='display: ;' /></td>
 <td>9/7/2012 1:36:45 PM</td>
</tr>
<tr class="item">
 <td align="center"><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AddControl1$gv','Select$4')">Edit</a></td>
 <td align="center" style="width:15px;">

5 个答案:

答案 0 :(得分:1)

:包含伪选择器不是W3C CSS Selector标准的一部分。因此,浏览器不支持使用它选择元素。一些JavaScript CSS选择器引擎(Sizzle,例如jQuery使用的引擎)提供了:包含伪选择器,但它的存在不能依赖。

如果必须通过元素的文本内容找到元素,那么此时唯一的解决方案是使用XPath。在你的案例中如何找到这个的(表现很差)的例子如下:

IWebElement element = driver.FindElement(By.XPath("//td[contains(., 'John John')"));

请注意,更好的解决方案始终是让您自动化的应用程序具有您需要查找的元素的正确ID。你应该使用文本来查找元素作为最后的手段。

答案 1 :(得分:0)

你可以试试这个

var webElements = (Driver.FindElements(By.XPath(elementXpath))).ToList();
webElements.FindIndex(item  => item.Text.Contains("John John").Click()

其中“elementXpath”是表“names”中每个单元格的路径。所以你得到名单,然后找到一个匹配。你会点击你的项目。

答案 2 :(得分:0)

使用javascript执行器点击元素可能会更好。我使用一个非常慢的IE9 64位模拟器,似乎点击某些按钮的唯一方法是使用javascript执行器。

答案 3 :(得分:0)

CSS选择器在这里不是很有用,因为CSS选择器处理html结构,即web元素的类型,关系和属性;它们在html内容上效果不佳,在这种情况下是内部文本内容“John John”。

但是,xpath将适用于这项工作。您需要的函数是text(),它返回元素的内部文本内容:

//td[text()='John John']

所以你的webdriver代码应如下所示:

driver.FindElement(By.xpath("//td[text()='John John']"));

P.S。所有定位器都在firefox中使用Firepath验证。

答案 4 :(得分:-1)

您可以使用以下代码:

driver.FindElement(By.XPath("//td[contains(text(), 'John John')"));