WebDriver는 xpath, Html Agility Pack을 사용하여 요소를 찾을 수 없습니다.

c# html-agility-pack visual-studio-2010 webdriver xpath

문제

나는 Html Agility Pack에 지속적으로 문제가있다. XPath 쿼리는 매우 단순 할 때만 작동합니다.

//*[@id='some_id']

또는

//input

그러나 언제든지 그들은 더 복잡 해지면 Html Agility Pack이 처리 할 수 ​​없습니다. 다음은 웹Driver를 사용하여 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 민첩성 팩 은 요소를 다르게 처리합니다. 기본적으로 자식 요소가 있다고 보고하지 않습니다.

지정한 특정 예에서이 쿼리는 대상 요소를 찾습니다.

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


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.