1

我正在尝试使用 Selenium 的 Xpath 功能来找到一组元素。我已经在 FireFox 上使用 FirePath 来创建和测试我想出的 Xpath,它工作得很好,但是当我在我的 C# 测试中使用 Xpath 和 Selenium 时,什么都没有返回。

var MiElements = this._driver.FindElements(By.XPath("//div[@class='context-menu-item' and descendant::div[text()='Action Selected Jobs']]"));

并且 Html 看起来像这样:- 任何人都可以指出我的正确,因为我在网上阅读的所有内容都告诉我这个 Xpath 是正确的。

提前感谢大家。

4

2 回答 2

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']]"));
于 2013-06-27T11:08:57.917 回答
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;
}

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

希望能帮助到你。

于 2013-06-27T11:56:34.770 回答