这与我之前的问题 https://stackoverflow.com/questions/6127769/webdriver-can-find-element-using-xpath-html-agility-pack-cannot,但似乎我还有另一个极端情况,其中 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 不能。
有任何想法吗?
这是“设计使然”。 OPTION 和 FORM 的想法是一样的。由于历史原因,Html Agility Pack 对某些标签的处理方式有所不同。在 HTML 3.2 时代,OPTION 并不总是关闭的,而在 HTML 3.2 中,它不是必需的。
尝试添加这个:
HtmlNode.ElementsFlags.Remove("option");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)