c# - utf8 - visual studio htmlagilitypack



WebDriverはxpathを使用して要素を見つけることができますが、Html Agility Packでは (1)

私は絶えず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'] 、しかし、この具体的な例は修正されますが、私は、WebDriverのxpathエンジンやFirePathやFireFinderアドオンの動作をFirefoxに正確に、あるいは少なくとも密接に反映させるものが必要です。

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/div/div[2]/table/tr/td/table/tr/td/div/table/tr/td/div/div[2]/input

しかし、その動作は設定可能です。 HTMLを解析する前にこの行を置くと、フォームは子ノードを与えます:

HtmlNode.ElementsFlags.Remove("form");




webdriver