2012-05-18 7 views
10

Używam biblioteki python biblioteki Selenium do skrobania danych ze strony html w Firefoksie.Selenowy python find_element_by_class_name() przestał działać od wersji 2.2 do 2.21 - nie można użyć "Nazwa klasy złożonej"

Musiałem zaktualizować z Selenium 2.0 do 2.21, ponieważ serwer zaktualizował Firefox.

w V 2,21 wywołania find_element_by_class_name("grid-cell-inner grid-col-name") nie powiedzie się z:

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

Nazwa klasy elementu Próbuję dostępu jest grid-cell-inner grid-col-name

Wezwanie do find_element_by_class_name() pracował w V 2.2, więc logika jest poprawne, a dane okazały się prawidłowe. Coś zmieniono w wersji 2.21.

Wszystkie przykłady Selenium podają proste przykłady z nazwą klasy foo itp., I żadne z typem nazwy nie jest wymagane.

Dlaczego firma Selenium przestała wspierać wyszukiwanie klas o nazwach takich jak grid-cell inner grid-col-name i jakie są ich rozwiązania?

Czy ktoś może mi pomóc znaleźć elementy z nazwami "złożonych" klas?

Dzięki.

Odpowiedz

0

Selenium nie obsługuje nazw klas związków przez bardzo długi czas myślałem.

Nie trzeba dodawać, spróbuj przez XPath lub selektor CSS lub nazwę klasy "grid-cell-inner", a następnie filtrując, aby zobaczyć, które elementy mają klasę "grid-cell-inner grid-col-name".

13

Problem z WebDriver polega na tym, że wciąż ewoluuje. Dużo. Osobiście nie wiem o wersji obsługującej przeszukiwanie wielu klas w jednym poleceniu, więc musiało to być dość stare :).

Wyszukiwanie przez CSS selector powinny działać, jednakże:

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

Nie polecam korzystania XPath dla tej konkretnej rzeczy, ponieważ te dwa poniższe wyrażenia są różne rzeczy:

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

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

+0

To nie jest poszukiwanie przez wielu klasach; nazwy klas w html, nad którymi nie mam kontroli, mają spacje w nich. Jeśli jest to "nazwa klasy złożonej", to po co przestać ją wspierać? Cała nasza logika jest teraz zepsuta. –

+0

Właściwie nie. To dwie oddzielne klasy: 'grid-cell-inner' i' grid-col-name', jestem w 100% pozytywny. Nie znam powodu, dla którego Selenium nie wspiera wyszukiwania według wielu nazw klas - ale myślę, że właśnie do tego służą selektory CSS. Jeśli zadziałało, musiało to być kilka wersji alfa lub beta, ponieważ nie znalazłem żadnej wzmianki o tym w dzienniku zmian. Idź z rozwiązaniem selektora CSS, które powinno to zrobić. –

+0

A [quick googling] (http://www.w3schools.com/tags/att_standard_class.asp) mówi tak: _ Aby określić wiele klas, oddziel nazwy klas za pomocą spacji, np. . Umożliwia to łączenie kilku klas CSS dla jednego elementu HTML._ –

6

Musisz użyć CssSelector i W formacie ".nameA.nameB.nameC" możesz mieć tyle, ile chcesz, po prostu dodaj "."

Alternatywnie można dopasować cały atrybut (można też zrobić to z XPath): "[class = 'dokładną nazwę klasy oto]" XPath - „// [@ class =' ​​dokładną nazwę klasy tutaj „]”

Istnieją sposoby, aby zrobić rozpoczyna się lub kończy lub zawiera zbyt (zarówno w CSS i XPath), który pomaga, jeśli zajęcia są generowane dynamicznie.

+1

Czy nie powinno to być "// * [@ class =" dokładna nazwa klasy tutaj "]"? Nacisk na * – sshevlyagin

+0

Więc, czy * może być obecny, czy nie? –

0

też spróbować:

elements = bot.execute_script("""return document.getElementsByClassName('grid-cell-inner grid-col-name')""") 
Powiązane problemy