2011-06-03 93 views
3

這與my previous question有關,但似乎我還有另一種情況,Html Agility Pack無法按預期工作。Html Agility Pack找不到使用xpath的列表選項

這裏是HTML(剝離下來的要領,並刪除敏感信息):

<html> 
<select id="one-time-payment-form:vendor-select-supplier"> 
    <option value="1848">Frarma Express</option> 
    <option value="2119">Maderas Garcia</option> 
    <option value="1974">Miaris, S.A.</option> 
    <option value="3063">Ricoh Panama</option> 
    <option value="3840">UNO EXPRESS</option> 
    <option value="68">Garrett Blaser Gretsch</option> 
    <option value="102">Oriel Antonio Grau</option> 
</select> 
</html> 

而這裏的代碼:

const string xpath = "//*[contains(@id, 'one-time-payment-form:vendor-select-')]/option[contains(text(), 'UNO EXPRESS')]"; 
var driver = new FirefoxDriver(new FirefoxProfile()) { Url = "PATH_TO_FILE_CONTAINING_HTML_SHOWN_ABOVE" }; 
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 }; 
HtmlNode.ElementsFlags.Remove("form"); 
htmlDoc.LoadHtml(source); 
var nodes = htmlDoc.DocumentNode.SelectNodes(xpath); 
Console.WriteLine(nodes!=null ? "Html Agility Pack success" : "Html Agility Pack failure"); 

driver.Quit(); 

當我運行代碼,控制檯上寫着:

WebDriver success 
Html Agility Pack failure 

很清楚WebDriver沒有問題定位該項目@XPath //*[contains(@id, 'one-time-payment-form:vendor-select-')]/option[contains(text(), 'UNO EXPRESS')],但Html敏捷包不能。

任何想法?

回答

5

這是「按設計」。對於OPTION和FORM,這是相同的想法。由於Html Agility Pack的歷史原因,某些標籤的處理方式不同。當時在HTML 3.2的時候,OPTION並不總是封閉的,而在HTML 3.2中,並不是必需的。

嘗試添加此:

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

真棒!非常感謝,修復它。是否有文檔指出Html Agility Pack中的其他任何奇怪之處? – Anders 2011-06-03 17:29:20

+0

特殊情況列表:http://htmlagilitypack.codeplex.com/discussions/253940 – Anders 2011-06-03 18:09:30