Selenium python find_element_by_class_name() перестает работать с версии 2.2 до 2.21 - не может использовать 'Compound Class Name'

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

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

В v 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, и каково это их решение?

Кто-нибудь может помочь мне найти элементы с именами "сложных" классов?

Спасибо.

Ответ 1

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

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

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

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

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

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

Ответ 2

Вам нужно использовать CssSelector в формате ".nameA.nameB.nameC", вы можете иметь столько, сколько хотите, просто добавьте "."

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

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

Ответ 3

Selenium не поддерживал сложные имена классов в течение очень долгого времени, я думал.

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

Ответ 4

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

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