我正在使用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>
答案 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.CssSelector
或By.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类中的任何空格都代表一个新的类名,所以只需按第一个单词搜索。