【问题标题】:Unable to find element with css selector无法使用 css 选择器找到元素
【发布时间】:2012-09-03 14:42:54
【问题描述】:

使用 C# (.Net) 为 FF/IE 使用 Selenium Webdriver

以下是我的页面源代码,我正在尝试使用 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;">

【问题讨论】:

    标签: selenium css-selectors webdriver selenium-webdriver


    【解决方案1】:

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

    如果必须通过元素的文本内容来查找元素,此时唯一的解决方案是使用 XPath。在你的情况下如何找到这个的一个(非常糟糕的)例子如下:

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

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

    【讨论】:

    • 吉姆,我听到了,最好的方法是什么?
    • 这是您必须依赖 XPath 作为选择器的少数情况之一。否则,请修复该站点,以便为您要定位的 元素提供正确的 ID。
    • 尝试了你的最新代码,得到了这个错误消息The xpath expression '//td[contains(., 'John John')' cannot be evaluated or does notresult in a WebElement
    【解决方案2】:

    你可以试试这个

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

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

    【讨论】:

    • 什么是 webElements ?是 IWebElements 吗?我尝试使用IWebElements,但给我一个错误...错误'OpenQA.Selenium.IWebElement' does not contain a definition for 'FindIndex' and no extension method 'FindIndex' accepting a first argument of type 'OpenQA.Selenium.IWebElement' could be found (are you missing a using directive or an assembly reference?)
    • 对不起,这是我的错,当然,它是一个变量。我更正了帖子。
    • 与让 XPath 引擎为您选择正确的元素相比,这将是非常低效的。 XPath "contains()" 函数是完成此任务的正确方法。
    【解决方案3】:

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

    【讨论】:

    • ie9 64位模拟器?你这是什么意思
    • 对不起。 IE9 64位驱动程序。我正在使用在 64 位上运行的 IEdriver。
    【解决方案4】:

    CSS 选择器在这里不是很有用,因为 CSS 选择器作用于 html 结构,即 web 元素的类型、关系和属性;它们不适用于 html 内容,在本例中是内部文本内容“John John”。

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

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

    所以你的 webdriver 代码应该是这样的:

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

    附:在 firefox 中使用 Firepath 验证的所有定位器。

    【讨论】:

      【解决方案5】:

      您可以使用以下代码:

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

      【讨论】:

        猜你喜欢
        相关资源
        最近更新 更多
        热门标签