Html Agility Pack не может найти опцию списка с помощью xpath - PullRequest
3 голосов
/ 03 июня 2011

Это связано с моим предыдущим вопросом , но, похоже, у меня есть еще один угловой случай, когда Html Agility Pack работает не так, как ожидалось.

Вот 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 Agility Pack не может.

Есть идеи?

1 Ответ

5 голосов
/ 03 июня 2011

Это "по замыслу".Это та же идея для OPTION и FORM.Некоторые теги обрабатываются Html Agility Pack по-разному по историческим причинам.Тогда во времена HTML 3.2 OPTION не всегда был закрыт, а в HTML 3.2 это не обязательно.

Попробуйте добавить это:

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