不支持复合类名称。考虑搜索一个类名并过滤结果

时间:2013-12-03 21:06:04

标签: c# selenium webdriver selenium-webdriver

我正在使用driver.findelement by.classname方法在firefox浏览器上读取一个元素,但我得到“不支持复合类名。请考虑搜索一个类名并过滤结果。”例外

这是我的代码

driver.FindElement(By.ClassName("bighead crb")).Text.Trim().ToString()

//and here is how the html of browser looks like

<form action="#" id="aspnetForm" onsubmit="return false;">
    <section id="lx-home" style="margin-bottom:50px;">
  <div class="bigbanner">
    <div class="splash mc">
      <div class="bighead crb">LEAD DELIVERY MADE EASY</div>
    </div>
  </div>
 </section>
</form>

2 个答案:

答案 0 :(得分:22)

不,就你的问题而言,你自己的答案并不是最好的。

想象一下你有这样的HTML:

<div class="bighead ght">LEAD DELIVERY MADE HARD</div>
<div class="bighead crb">LEAD DELIVERY MADE EASY</div>

driver.FindElement(By.ClassName("bighead"))会找到这两个并返回第一个div,而不是您想要的那个。你真正想要的是像driver.FindElement(By.ClassName("bighead crb"))这样的东西,但就像你在你的问题中所说的那样,这不会起作用,因为你需要另一种方法来按复合类名来查找元素。

这就是大多数人使用功能更强大By.CssSelectorBy.XPath的原因。然后你有:

CssSelector(最好):

driver.FindElement(By.CssSelector(".bighead.crb")); // flexible, match "bighead small crb", "bighead crb", "crb bighead", etc.
driver.FindElement(By.CssSelector("[class*='bighead crb']")); // order matters, match class contains  "bighead crb"
driver.FindElement(By.CssSelector("[class='bighead crb']")); // match "bighead crb" strictly

XPath(更好):

driver.FindElement(By.XPath(".//*[contains(@class, 'bighead') and contains(@class, 'crb')]")); // flexible, match "bighead small crb", "bighead crb", "crb bighead", etc.
driver.FindElement(By.XPath(".//*[contains(@class, 'bighead crb')]")); // order matters, match class contains string "bighead crb" only
driver.FindElement(By.XPath(".//*[@class='bighead crb']")); // match class with string "bighead crb" strictly

答案 1 :(得分:2)

想出这个问题,你必须搜索:

driver.FindElement(By.ClassName("bighead")).Text.Trim().ToString(); //instead of 
driver.FindElement(By.ClassName("bighead crb")).Text.Trim().ToString();

html类中的任何空格都代表一个新的类名,所以只需按第一个单词搜索。