我正在尝试使用Selenium的Xpath能力来找到一组元素。我在FireFox上使用了FirePath来创建和测试我提出的Xpath,并且工作得很好但是当我在使用Selenium的c#test中使用Xpath时,没有返回任何内容。
var MiElements = this._driver.FindElements(By.XPath("//div[@class='context-menu-item' and descendant::div[text()='Action Selected Jobs']]"));
和Html看起来像这样: - 任何人都可以指出我,因为我在网上看到的一切都告诉我这个Xpath是正确的。
提前感谢你们。
答案 0 :(得分:1)
请发布实际的 HTML,这样我们就可以将其“放入”HTML文件并自己尝试,但我注意到类名末尾有一个尾随空格:
<div title="Actions Selected Jobs." class="context-menu-item " .....
因此强制XPath首先剥离尾随空格:
var MiElements = this._driver.FindElements(By.XPath("//div[normalize-space(@class)='context-menu-item' and descendant::div[text()='Action Selected Jobs']]"));
答案 1 :(得分:0)
也许您没有考虑元素需要加载的时间,并且当它们尚未“可搜索”时您会查找它们。 更新我跳过了有关此问题的示例。请参阅 Slanec的评论。
无论如何,Selenium建议尽可能避免使用xpath进行搜索,因为它更慢且更“脆弱”。 你可以找到这样的元素:
//see the method code below
WebElement div = findDivByTitle("Action Selected Jobs");
//example of searching for one (first found) element
if (div != null) {
WebElement myElement = div.findElement(By.className("context-menu-item"));
}
......
//example of searching for all the elements
if (div != null) {
WebElement myElement = div.findElements(By.className("context-menu-item-inner"));
}
//try to wrap the code above in convenient method/s with expressive names
//and separate it from test code
......
WebElement findDivByTitle(final String divTitle) {
List<WebElement> foundDivs = this._driver.findElements(By.tagName("div"));
for (WebElement div : foundDivs) {
if (element.getAttribute("title").equals(divTitle)) {
return element;
}
}
return null;
}
这是近似代码(根据您的解释),您应该更好地适应您的目的。同样,请记住将加载时间考虑在内,并将实用程序代码与测试代码分开。
希望它有所帮助。