2012-05-18 12 views
10

Sto utilizzando la libreria Python di Selenium per analizzare i dati da una pagina html in Firefox.Python selenio find_element_by_class_name() ha smesso di funzionare dalla versione 2.2 alla 2.21 - non può utilizzare "Nome classe composto"

Ho dovuto aggiornare da Selenium 2.0 a 2.21 perché il server ha aggiornato Firefox.

In v 2.21 chiamate verso find_element_by_class_name("grid-cell-inner grid-col-name") fallisce con:

selenium.common.exceptions.WebDriverException: Message: u'Compound class names not permitted' 

Il nome della classe dell'elemento che sto cercando di accesso è grid-cell-inner grid-col-name

La chiamata a find_element_by_class_name() lavorato in v 2.2, quindi la logica è corretto, e i dati utilizzati per essere trovati OK. Qualcosa è cambiato in v 2.21.

Tutti gli esempi di selenio forniscono esempi semplici con il nome di classe foo ecc. E nessuno con il tipo di nome che è necessario accedere.

Perché il Selenium ha smesso di supportare la ricerca di classi con nomi come grid-cell inner grid-col-name e quale è la loro soluzione?

Qualcuno può aiutarmi a trovare elementi con nomi di classi "composti"?

Grazie.

risposta

0

Il selenio non ha supportato i nomi delle classi di composti per un tempo molto lungo ho pensato.

Inutile dire che provate tramite il selettore XPath o CSS o dal nome della classe di "grid-cell-inner", quindi filtrate per vedere quali elementi hanno la classe di "grid-cell-inner grid-col-name".

13

Il problema di WebDriver è che si evolve ancora. Un sacco. Personalmente non conosco una versione che supporta la ricerca di molte classi in un unico comando, quindi deve essere stata abbastanza vecchia :).

Ricerca da un CSS selector dovrebbe funzionare, però:

find_element_by_css_selector(".grid-cell-inner.grid-col-name"); 

Non consiglio usando XPath per questa cosa particolare, perché queste due espressioni seguenti sono una cosa diversa:

//*[class='grid-cell-inner grid-col-name']

//*[class='grid-col-name grid-cell-inner']

+0

Non sta cercando da più classi; i nomi delle classi in html, su cui non ho controllo, hanno spazi in essi. Se questo è un "nome classe composto", allora perché smettere di supportarlo? Tutta la nostra logica è ora rotta. –

+0

In realtà, no. Sono due classi separate, 'grid-cell-inner' e' grid-col-name', sono al 100% positivo su questo. Non conosco il motivo alla base del fatto che Selenium non supporta la ricerca in molti nomi di classe, ma suppongo che questo sia ciò a cui i selettori CSS servono. Se ha funzionato, deve essere stata una versione alfa o beta, perché non ho trovato alcuna menzione di questo in un log delle modifiche. Vai con la soluzione selettore CSS, che dovrebbe farlo. –

+0

Un [quick googling] (http://www.w3schools.com/tags/att_standard_class.asp) dice questo: _Per specificare più classi, separare i nomi di classe con uno spazio, ad es. . Ciò consente di combinare diverse classi CSS per un elemento HTML ._ –

6

È necessario utilizzare un CssSelector i Nel formato ".nameA.nameB.nameC" puoi averne quanti ne vuoi, basta aggiungere il "."

In alternativa è possibile abbinare l'intero attributo (si può anche fare questo con XPath): "[class = 'esatto nome della classe qui']" XPath - "// [@ class = 'esatto nome della classe qui ']"

ci sono modi per fare inizia con o termina con o contiene troppo (sia in CSS e XPath), che aiuta se le classi sono generate dinamicamente.

+1

Non dovrebbe essere "// * [@ class = 'nome classe esatto qui']"? Enfasi su * – sshevlyagin

+0

Quindi, dovrebbe * essere presente o no? –

0

provare anche:

elements = bot.execute_script("""return document.getElementsByClassName('grid-cell-inner grid-col-name')""") 
Problemi correlati