WebDriver può trovare l'elemento usando xpath, non può farlo con il pacchetto agilità Html

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

Domanda

Ho sempre avuto problemi con Html Agility Pack; le mie query XPath funzionano sempre e solo quando sono estremamente semplici:

//*[@id='some_id']

o

//*[@id='some_id']

Tuttavia, ogni volta che diventano più complicate, allora Html Agility Pack non può gestirlo. Ecco un esempio che illustra il problema, sto utilizzando WebDriver per navigare su Google e restituisco il sorgente della pagina, che viene passato a Html Agility Pack, e sia il tentativo di localizzazione dell'elemento / nodo (C #) sia di WebDriver e HtmlAgilityPack:

//*[@id='some_id']

In questo caso, WebDriver ha localizzato correttamente l'oggetto, ma Html Agility Pack no.

Lo so, lo so, in questo caso è molto facile cambiare xpath in uno che funzionerà: // input [@ name = 'q'] , ma questo risolverà solo questo specifico esempio, che non è il punto, Ho bisogno di qualcosa che rispecchi esattamente o almeno da vicino il comportamento del motore xpath di WebDriver, o anche i componenti aggiuntivi di FirePath o FireFinder per Firefox.

Se WebDriver riesce a trovarlo, allora perché non può trovare anche Html Agility Pack?

Risposta accettata

Il problema che stai incontrando è con l'elemento FORM. HTML Agility Pack gestisce questo elemento in modo diverso : per impostazione predefinita, non segnalerà mai di avere figli.

Nell'esempio particolare che hai fornito, questa query trova l'elemento di destinazione:

.//div/div[2]/table/tr/td/table/tr/td/div/table/tr/td/div/div[2]/input

Tuttavia, questo non è così, quindi è chiaro che l'elemento del modulo sta facendo scattare il parser:

.//form/div/div[2]/table/tr/td/table/tr/td/div/table/tr/td/div/div[2]/input

Questo comportamento è configurabile, però. Se posizioni questa riga prima di analizzare l'HTML, il modulo ti darà i nodi figli:

HtmlNode.ElementsFlags.Remove("form");



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché