Проблема с кликом по svg, selenium, python

не кликает по объекту svg, что я не пробовал код:

    `from selenium import webdriver`
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains

class weBot():
    
    def __init__(self):
    #     from selenium import webdriver
    #     import time
    #     from selenium.webdriver.common.by import By
        self.driver = webdriver.Chrome()
    def init(self, log, passwor):
        self.driver.get("https://oskelly.ru/")
        self.driver.maximize_window()
        time.sleep(5)                                                      
        # but1 = self.driver.find_element(By.XPATH, '//svg[@class="osk-icon osk-icon_size-l osk-header-top-actions__link"]//use[@href="#profile"]/..')
        # but1.click()
        element1 = self.driver.find_element(By.CSS_SELECTOR, "svg use[href='#profile']")
        element1.click()
        but2 = self.driver.find_element(By.CSS_SELECTOR, "button.osk-button.osk-button_color-secondary.osk-button_size-m")
        but2.click()
        mail = self.driver.find_element(By.CLASS_NAME, "osk-input__input")
        mail.send_keys(log)
        passw = self.driver.find_element(By.CSS_SELECTOR, "input.osk-input__input[type='password']")
        passw.send_keys(passwor)
        but3 = self.driver.find_element(By.CSS_SELECTOR, "button.osk-button_color-primary.osk-button_size-m")
        but3.click()
    def otziv(self, url):
        time.sleep(5000)
        self.driver.get(url)
        elements = self.driver.find_elements(By.CLASS_NAME, 'catalog-product-item')
        elements[0].click()

        return "отзыв сделан"
`wB = weBot()`

сайт https://oskelly.ru помогите пожалуйста


Ответы (1 шт):

Автор решения: Кимерченко

Ты жмёшь по <use href="#profile">, а это не интерактивный элемент. Браузер по умолчанию не реагирует на клики по <use>, Selenium тем более. Клик уходит в никуда.

Жать надо на родителя - чаще всего это <svg>, но правильнее кликать по кнопке или ссылке, в которую завернут SVG.

И не надо time.sleep(5) - это костыль. Лучше ждать, пока элемент станет кликабельным.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)

driver.get("https://oskelly.ru")
driver.maximize_window()

# способ 1 - нажать на кнопку входа в шапке
profile_btn = wait.until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, "button.osk-header-top-actions__link"))
)
profile_btn.click()

# способ 2 - найти use и кликнуть по ближайшему родителю
svg_use = wait.until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "svg use[href='#profile']"))
)
driver.execute_script("arguments[0].closest('a,button').click()", svg_use)

driver.quit()

p.s: time.sleep(5000) - это не 5 секунд, а почти 1.5 часа. Без driver.quit() Chrome будет висеть в процессах.

→ Ссылка