如何解决WebDriver可以使用xpath查找元素,Html Agility Pack不能
| Html Agility Pack一直存在问题;我的XPath查询只有在非常简单的情况下才起作用://*[@id=\'some_id\']
要么
//input
但是,只要它们变得更加复杂,Html Agility Pack就无法处理。
这是一个演示问题的示例,我正在使用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:// input [@name = \'q \'],但这只能解决此特定示例,这不是重点,我需要能够完全或至少紧密反映WebDriver的xpath引擎甚至是Firefox的FirePath或FireFinder附件的行为的东西。
如果WebDriver可以找到它,为什么Html Agility Pack也找不到它?
解决方法
您遇到的问题与FORM元素有关。 HTML Agility Pack处理该元素的方式有所不同-默认情况下,它将永远不会报告它有子元素。
在您给出的特定示例中,此查询确实找到了目标元素:
.//div/div[2]/table/tr/td/table/tr/td/div/table/tr/td/div/div[2]/input
但是,事实并非如此,因此很显然form元素会触发解析器:
.//form/div/div[2]/table/tr/td/table/tr/td/div/table/tr/td/div/div[2]/input
但是,该行为是可配置的。如果在分析HTML之前放置此行,则该表单将为您提供子节点:
HtmlNode.ElementsFlags.Remove(\"form\");
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。