Как найти элемент по названию класса в selenium c#?
Есть класс со следующим именем: "_postpost page_block post--withPostBottomAction post--with-likes deep_active". Как можно найти элементы с таким классом на странице, если выдается ошибка: Compound class names not allowed. Cannot have whitespace in class name. Все говорят использовать XPath. Есть ли решение без использования Xpath?
<div id="post-103083994_3958581" class="_post post page_block post--withPostBottomAction post--with-likes deep_active" data-post-id="-103083994_3958581" onclick="wall.postClick('-103083994_3958581', event);" data-replies-limit="1" post_view_hash="c8430e7d826fa686cc">
<div class="_post_content">
Ответы (2 шт):
Селениум не работает с computed/Compound properties (в даном частном случае - "Compound class") - т.е. если в проперти class указано много классов через пробел.
Поэтому НЕ НУЖНО пытаться искать по всему полю указанному в классе. Нужно искать или ПО ОДНОМУ ИЗ УКАЗАННЫХ класcов (например только по post--withPostBottomAction или любому иному) или...
реализовать костыль который фиксит этот недостаток у селениума что бы он начал работать с computed properties.
driver.FindElement(By.Xpath(".//span[contains(@class,'list-item')] AND [contains(@class,'list-item-station')]"));
можно написать такую функцию которая генерит подобный икспас. Тогда сможешь искать что необходимо в том числе по computed properties.
Вся магия в автоматическом преобразовании строки с классом
_post post page_block post--withPostBottomAction post--with-likes deep_active
в строку
[contains(@class,'_post')] AND [contains(@class,'page_block')] AND [contains(@class,'post--withPostBottomAction')] AND [contains(@class,'post--with-likes')] AND [contains(@class,'deep_active')]
тогда сможешь использовать икспас и на Compound class-ах.
ничего сложного в этом нет.
Все говорят использовать XPath. Есть ли решение без использования Xpath?
Есть.
- id
- name
- link_text
- css selector
и др. способами которые можно указать в методе driver.FindElement(By.......)
Но вообще родным способом для селениума было бы просто указывать икспас через путь. Не обязательно полный. То есть что-то вроде:
.FindElement(By.XPath(".//div[@data-marker='items']/div/div/../span[@class='post--withPostBottomAction']")
Это правильный официально закрепленный способ использовать Xpath в селениуме.
не надо изобретать велосипед, добавьте по By.CssSelector и вообще здесь очень подробно всё написано, чем Вы можете пользоваться https://selenium-python.readthedocs.io/locating-elements.html