Как подождать загрузку кнопки через Selenium

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

Занимаюсь парсингом динамического сайта (selenium-wire, bs4). Проблема в том, что скриптом нужно находить кнопку и нажимать на неё, чтобы страница дальше проскролилась и контент прогрузился.

Я на данный момент перепробовал разные варианты, но все они какие-то "костыльные"

Вот это моя последняя рабочая версия

        try:
            while self.driver.find_element(By.CSS_SELECTOR, '.event__more--static'): 
                self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
                self.driver.find_element(By.CSS_SELECTOR, '.event__more--static').click()
                time.sleep(3)
        except: 
            print('Вы на дне!')

Проблема в том, что я не могу убрать задержку, тогда код падает из-за того, что элемент не найден (потому что новая кнопка "Показать больше" ещё не загрузилась). И дублирование кода тоже очень сильно смущает

Попробовал ждать элемент на странице через методы selenium

def takeContent(self): 
        """Забирает контент со страницы"""       
     while True: 
        try:
            self.element = WebDriverWait(self.driver, 10).until(
                EC.presence_of_element_located((By.CSS_SELECTOR, '.event__more--static'))
            )
            self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            print(f'Я ИЩУ КНОПКУ - {self.element}')
            self.element.click()
        except: 
            print('Вы на дне!')
            break

Данный код попросту отказывается работать. Просто после первого нажатия на кнопку закрывается браузер и всё

На основе комментариев дописал до такого кода

def takeContent(self): 
        """Забирает контент со страницы"""    
        try:
            while True:
                button = WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.event__more--static')))
                print('Я нашёл кнопку - ', button)
                self.driver.execute_script("arguments[0].click();", button)
                print('Я нажал кнопку - ', button)
        except:
            print('Вы на дне!')
            self.content = self.driver.page_source

Теперь проблема следующая:

Я нашёл кнопку -  <selenium.webdriver.remote.webelement.WebElement (session="efb72689d4c57f4b5ba6f5c7ce89afb2", element="41d0f0da-e895-415c-bfad-1eddd0dad1fd")>
Я нажал кнопку -  <selenium.webdriver.remote.webelement.WebElement (session="efb72689d4c57f4b5ba6f5c7ce89afb2", element="41d0f0da-e895-415c-bfad-1eddd0dad1fd")>
Я нашёл кнопку -  <selenium.webdriver.remote.webelement.WebElement (session="efb72689d4c57f4b5ba6f5c7ce89afb2", element="41d0f0da-e895-415c-bfad-1eddd0dad1fd")>
Я нажал кнопку -  <selenium.webdriver.remote.webelement.WebElement (session="efb72689d4c57f4b5ba6f5c7ce89afb2", element="41d0f0da-e895-415c-bfad-1eddd0dad1fd")>
Я нашёл кнопку -  <selenium.webdriver.remote.webelement.WebElement (session="efb72689d4c57f4b5ba6f5c7ce89afb2", element="41d0f0da-e895-415c-bfad-1eddd0dad1fd")>

Он спамит нажатием на одну кнопку. А сайт всё это время крутит лоадинг и не может прогрузить ни один дополнительный "экран". Можно ли как-то написать, чтобы код ждал подгрузки контента?

Ответы

▲ 1Принят

Он спамит нажатием на одну кнопку. А сайт всё это время крутит лоадинг и не может прогрузить ни один дополнительный "экран". Можно ли как-то написать, чтобы код ждал подгрузки контента?

Возьмите CSS селектор лоадинга.

Сначала дождитесь его, пока он появится, с помощью WebDriverWait().until

Затем дождитесь когда он пропадёт WebDriverWait().until_not чтобы продолжить работать со страницей.

Эти оба ожидания лучше обернуть в try-except на случай, если лоадинг вообще не появится

(Либо делать WebDriverWait на те элементы которые должны подгрузиться, например проверкой их на кликабельность или визуальное отображение)

▲ 0

Браузер перезагружает страницу в определенный момент, я бы использовал WebDriverWait

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

def takeContent(self):
    """Забирает контент со страницы"""
    while True:
        try:
            button = WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.event__more--static')))
            self.driver.execute_script("arguments[0].click();", button)
            WebDriverWait(self.driver, 10).until(EC.staleness_of(button))
            print('Кнопка нажата')
        except:
            print('Вы на дне!')
            break