gpt4 book ai didi

c# - WebDriver 可以使用 xpath 找到元素,Html Agility Pack 不能

转载 作者:行者123 更新时间:2023-11-30 14:02:19 26 4
gpt4 key购买 nike

我一直在使用 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 更改为有效的路径://input[@name='q'],但这只会解决这个问题具体的例子,这不是重点,我需要一些能够完全或至少接近反射(reflect) WebDriver 的 xpath 引擎的行为,甚至是 FirePath 或 FireFinder add-转到 Firefox。

WebDriver能找到,为什么Html Agility Pack也找不到?

最佳答案

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

在您给出的特定示例中,此查询确实找到了目标元素:

.//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");

关于c# - WebDriver 可以使用 xpath 找到元素,Html Agility Pack 不能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6127769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com