python: кнопка на сайте www.soccer24.com стала не кликабельна!

Рейтинг: 0Ответов: 2Опубликовано: 04.04.2023

Долгое время работал вот этот код!

driver.get("https://www.soccer24.com/")
buttons = driver.find_elements('css selector', '#live-table > div.filters > div.calendarCont > div > '
                                           'button.calendar__navigation.calendar__navigation--tomorrow') 
for button in buttons:
   button. Click()

Видимо что-то админ сайта изменил - никак не могу понять что! Есть подозрение, что сайт стал распознавать курсор мыши над кнопкой!

введите сюда описание изображения

Ответы

▲ 0Принят

В документации не нашел вызова с 3 аргументами, попробуйте следующее:

buttons = driver.find_elements('css selector', '#live-table > div.filters > div.calendarCont > div > button.calendar__navigation.calendar__navigation--tomorrow') 

или с использование By.CSS_SELECTOR:

from selenium.webdriver.common.by import By

buttons = driver.find_elements(By.CSS_SELECTOR, '#live-table > div.filters > div.calendarCont > div >    button.calendar__navigation.calendar__navigation--tomorrow') 

Кнопка нажимается путем JS в консоли (F12 - dev tools) без мыши:

document.querySelector('#live-table > div.filters >   div.calendarCont > div >    button.calendar__navigation.calendar__navigation--tomorrow').click()

так что и в Python не должно быть вопросов.

В дополнению к ответу хочу сказать что по-видимому кнопка на сайте одна поэтому делать for нет смысла как и искать кнопки.

Таким образом код можно переписать как-то так:

driver.get("https://www.soccer24.com/")
button = driver.find_element('css selector', '#live-table > div.filters > div.calendarCont > div > button.calendar__navigation.calendar__navigation--tomorrow') 
button.Click()

Еще заметил у Вас разрыв между button. и Click() мне кажется Python должен на такое ругаться.

Обновление ответа

При тестировании кода на Cелениуме выяснилось что элемент не найден. Пришла идея дождаться его появления на страницы, после того как исчезнут скелетоны - те самые пустые квадратики, которые отображают где появятся элементы, что я и делаю в данном решении.

Необходимы дополнительные импорты:

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

Код:

driver.get("https://www.soccer24.com/")
selector = f'''#live-table > 
div.filters > 
div.calendarCont > div > 
button.calendar__navigation.calendar__navigation--tomorrow''' 

try:
   button = WebDriverWait(driver, 30).until(
   EC.presence_of_element_located((By.CSS_SELECTOR, selector))
)
finally:
    pass

if (button):
    button.click()

sleep(100)
driver.quit()

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

введите сюда описание изображения

▲ 0
driver.get("https://www.soccer24.com/")
time.sleep(5)
buttons = driver.find_elements('class name', 'calendar__navigation--tomorrow')
print(buttons)

for button in buttons:
   driver.execute_script("arguments[0].click();", button)
   time. Sleep(1)