Вопрос по python, webdriver – Selenium python find_element_by_class_name () перестал работать с v 2.2 до 2.21 - не может использовать «составное имя класса»

10

Я использую библиотеку Selenium для очистки данных с HTML-страницы в Firefox.

Мне пришлось обновить Selenium 2.0 до 2.21, потому что сервер обновил Firefox.

В версии 2.21 звонки наfind_element_by_class_name("grid-cell-inner grid-col-name") терпит неудачу с:

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

Имя класса элемента, к которому я пытаюсь получить доступ -grid-cell-inner grid-col-name

Призыв кfind_element_by_class_name() работал в версии 2.2, поэтому логика верна, а данные находились в порядке. Что-то изменилось в версии 2.21.

Все примеры Selenium дают простые примеры с именем классаfoo и т. д., и ни один из них с тем типом имени, который мне нуж

Почему Selenium перестал поддерживать поиск классов с такими именами, какgrid-cell inner grid-col-name а каково их решение?

Может кто-нибудь помочь мне найти элементы с «составными» именами классов?

Благодарность

Ваш Ответ

4   ответа
14

что он все еще развивается. Много. Лично я не знаю о версии, которая поддерживала поиск по многим классам в одной команде, поэтому она должна быть довольно старой:).

Поиск по CSS селектор должно работать, однако:

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

Я не рекомендую использовать @ XPa для этой конкретной вещи, потому что эти два следующих выражения - это разные вещи:

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

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

A быстро гуглят говорит это: Чтобы указать несколько классов, разделите имена классов пробелом, например, <span class = "оставлено важным">. Это позволяет комбинировать несколько классов CSS для одного элемента HTML. Petr Janeček
Это не поиск по нескольким классам; имена классов в html, которые я не контролирую, содержат пробелы. Если это «составное имя класса», то зачем прекращать его поддержку? Вся наша логика сейчас нарушена. Robert Hector
Да. Использование find_element_by_css_selector () и указание имен классов, как вы описали, работает хорошо. Мне нужно было всего лишь изменить несколько строк кода, и теперь я могу найти элементы. Большое спасибо Robert Hector
Вообще-то, нет. Это два отдельных класса,grid-cell-inner а такжеgrid-col-name, Я на 100% уверен в этом. Я не знаю причину, по которой Selenium не поддерживает поиск по многим именам классов, - но я полагаю, для этого и нужны CSS-селекторы. Если это сработало, то это была какая-то альфа или бета версия, потому что я не нашел упоминаний об этом ни в одном журнале изменений. Пойдите с решением селектора CSS, это должно сделать это. Petr Janeček
6

вы можете иметь столько, сколько хотите, просто добавьте «.»

В качестве альтернативы вы можете сопоставить весь атрибут (вы также можете сделать это с помощью xpath): " [class = 'точное имя класса здесь'] "XPath -" // [@ class = 'точное имя класса здесь'] "

Есть способы сделатьначинается или заканчивается илисодержи тоже (как в CSS, так и в xpath), что помогает, если классы генерируются динамически.

Разве это не должно быть "// * [@ class = 'точное имя класса здесь']"? Акцент на * sshevlyagin
Так, * должен присутствовать * или нет? Prakhar Mohan Srivastava
0

Нет необходимости говорить, попробуйте с помощью XPath или CSS-селектора или по имени класса «grid-cell-inner», а затем отфильтруйте, чтобы увидеть, какие элементы имеют класс «grid-cell-inner grid-col-name».

0

Также попробуйте:

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

Похожие вопросы