Selenium Xpath不匹配项目

时间:2013-06-27 10:54:38

标签: selenium selenium-webdriver

我正在尝试使用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是正确的。

提前感谢你们。

2 个答案:

答案 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;
}

这是近似代码(根据您的解释),您应该更好地适应您的目的。同样,请记住将加载时间考虑在内,并将实用程序代码与测试代码分开。

希望它有所帮助。