2013-06-27 104 views
1

我想使用Selenium的Xpath能力来找到一组元素。我已经在FireFox上使用FirePath来创建和测试我已经提出的Xpath,并且工作得很好,但是当我在Selenium的c#测试中使用Xpath时,没有返回任何内容。Selenium Xpath不匹配项目

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

和HTML看起来像这样: - 任何人都可以请点我权利,我已经阅读了网络对我说,这个XPath是正确的一切。

感谢您提前一切。

+0

您是否尝试过使用硒IDE(for firefox)为您生成命令? – Izzy

回答

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']]")); 
+0

抱歉,html是由客户端上的服务器和javascripts动态生成的。 – ToxicBlotch

+0

Cheers Arran看过那个空间后,你已经突出显示了我已经将空间添加到了我的Xpath中,并解决了它找不到元素的问题。然而,奇怪的是Firefox中的Firepath并不在意。 – ToxicBlotch

+2

@ToxicBlotch所有这一切,你可以考虑使用By.cssSelector(“div.context-menu-item [title ='Action Selected Jobs']”)'如果它符合你的要求(它与你有XPath有一点不同那里)。如果你需要处理类,CSS选择器(或者'By.className()')通常是要走的路。 –

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

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

希望它有帮助。

+0

对于一个XPath表达式(或在这种特殊情况下的单个CSS选择器),这是很多代码,没有额外的好处(没有处理您提到的异步加载问题)。如果担心加载异步加载的元素的时间,首选的方法是使用隐式/显式等待。虽然这会起作用,但我不相信它的有用性和好处。虽然XPath有时可能会变得棘手(主要是在这种情况下使用'class'处理),并且IE6 + 8的速度很慢(这里的速度不慢),但是如果正确使用并且不会过度使用,它们通常是正确的工具。 –

+1

完全同意你对加载时间的评论。我提到它只是为了防止ToxicBlotch不计入。 –

+1

至于代码(和我所提到的)它是近似的。根据您的需求进行调整,可能会缩短。此外,正确的方法是尽可能通用并将其放入单独的实用程序包中:因此它将不止一次地为您服务。另外,这不是关于代码量,而是关于它的质量:)我尽量避免使用xpath搜索:它不那么富有表现力且非常敏感,尤其是生成的html。 –