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无法找到它呢?
您遇到的问题是与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");
太棒了!我敢打赌,如果我查看以前有问题的XPath表达式,我会发现表单节点是它的根本原因。 – Anders 2011-05-25 19:30:33
我不得不使用HTML敏捷性包的XPath的解析很成功,所以我不知道是否可能是XPath是次优的。下面是一个适用于制作应用的例子:'.// div [@id = \“main \”] // div [@id = \“content \”] // div [@ id = \ “title \”]' – hemp 2011-05-25 17:45:15
不幸的是,我大部分时间都不是创建XPath表达式的人;我帮助管理我们的自定义WebDriver框架,因此如果QA中的某个人创建了可在WebDriver中工作的XPath表达式,那么它也必须在Html Agility Pack中工作。上面的示例仅用于捕获我们遇到的常见问题。 – Anders 2011-05-25 19:48:13