WebDriver可以使用xpath找到元素,Html敏捷包不能

问题描述:

我一直有Html Agility Pack的问题;WebDriver可以使用xpath找到元素,Html敏捷包不能

//*[@id='some_id'] 

//input 

然而,他们随时变得更加复杂,那么的Html敏捷包不能处理它:我的XPath查询时,他们都非常简单只有永远的工作。 下面是一个演示问题的示例,我使用WebDriver导航到Google,并返回传递给Html Agility Pack的页面源代码,WebDriver和HtmlAgilityPack都尝试查找元素/节点(C#):

//The XPath query 
const string xpath = "//form//tr[1]/td[1]//input[@name='q']"; 

//Navigate to Google and get page source 
var driver = new FirefoxDriver(new FirefoxProfile()) { Url = "http://www.google.com" }; 
Thread.Sleep(2000); 

//Can WebDriver find it? 
var e = driver.FindElementByXPath(xpath); 
Console.WriteLine(e!=null ? "Webdriver success" : "Webdriver failure"); 

//Can Html Agility Pack find it? 
var source = driver.PageSource; 
var htmlDoc = new HtmlDocument { OptionFixNestedTags = true }; 
htmlDoc.LoadHtml(source); 
var nodes = htmlDoc.DocumentNode.SelectNodes(xpath); 
Console.WriteLine(nodes!=null ? "Html Agility Pack success" : "Html Agility Pack failure"); 

driver.Quit(); 

在这种情况下,WebDriver成功找到该项目,但Html Agility Pack没有。

我知道,在这种情况下,很容易将xpath更改为可以工作的xpath://输入[@ name ='q'],但这只会修复此特定示例,它是不是重点,我需要的东西,将完全或至少紧密镜像WebDriver的xpath引擎的行为,甚至FirePath或FireFinder加载项的Firefox。

如果WebDriver能找到它,那么为什么Html Agility Pack无法找到它呢?

+1

我不得不使用HTML敏捷性包的XPath的解析很成功,所以我不知道是否可能是XPath是次优的。下面是一个适用于制作应用的例子:'.// div [@id = \“main \”] // div [@id = \“content \”] // div [@ id = \ “title \”]' – hemp 2011-05-25 17:45:15

+0

不幸的是,我大部分时间都不是创建XPath表达式的人;我帮助管理我们的自定义WebDriver框架,因此如果QA中的某个人创建了可在WebDriver中工作的XPath表达式,那么它也必须在Html Agility Pack中工作。上面的示例仅用于捕获我们遇到的常见问题。 – Anders 2011-05-25 19:48:13

您遇到的问题是与FORM元素。 HTML敏捷包handles that element differently - 默认情况下,它永远不会报告它有孩子。

在你给的特殊例子,这个查询确实发现目标元素:

.//div/div[2]/table/tr/td/table/tr/td/div/table/tr/td/div/div[2]/input

不过,这并没有,所以很明显的表单元素被绊倒了解析器:

.//form/div/div[2]/table/tr/td/table/tr/td/div/table/tr/td/div/div[2]/input

虽然这种行为是可配置的。如果你把之前解析HTML这一行,表格会给你的子节点:

HtmlNode.ElementsFlags.Remove("form"); 
+0

太棒了!我敢打赌,如果我查看以前有问题的XPath表达式,我会发现表单节点是它的根本原因。 – Anders 2011-05-25 19:30:33