Я собираю отзывы из Goodreads для проекта. Вот пример страницы, которую я пробовал: https://www.goodreads.com/book/show/2767052-the-hunger-games/reviews?
На странице отзывов изначально отображается 30 отзывов с кнопкой «Показать больше» внизу. Selenium, похоже, не может нажать кнопку.
Вот код, который я использую:
showmore_button = driver.find_element(By.XPATH, '/html/body/div[1]/div/main/div[1]/div[2]/div[4]/div[4]/div/button/span[1]')
driver.execute_script("arguments[0].click();", showmore_button)
я тоже пробовал
showmore_button.click()
но это приводит к исключению о том, что элемент не кликабельный
Для большего контекста мой драйвер настроен следующим образом:
def createdriver():
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument("start-maximized")
options.add_argument('--window-size=1920,1080')
options.add_argument("--incognito")
driver = webdriver.Chrome(options=options)
return driver
а затем я использую:
driver = createdriver()
driver.get(url)
Где URL-адрес страницы отзывов, которую я пытаюсь очистить
@СергейКох Я тоже попробовал кнопку, но, к сожалению, это привело к тому же результату. Я проверил страницу с помощью встроенных инструментов Chrome и скопировал полный xpath из элемента.
Я получил этот путь - /html/body/div[1]/div/main/div[1]/div[2]/div[5]/div[4]/div/button. Лучше найти кнопку по class = "Button Button--secondary Button--small"
@Alex, пожалуйста, поделитесь своим кодом, сделайте этот запрос запросом
@СергейКох Я попробовал оба, но не смог найти элемент ни для одного из вариантов






Поскольку страница загружается за несколько миллисекунд до отображения элемента, вам необходимо применить ожидание селена. Попробуйте использовать неявное ожидание после создания экземпляра драйвера, см. код ниже:
driver = createdriver()
driver.implicitly_wait(10)
driver.get(url)
Вышеприведенный код ждет 10 секунд в поисках элемента, прежде чем выдать ошибку
Также еще одно предложение: Вместо использования абсолютного XPath рекомендуется использовать относительный XPath. Это связано с тем, что относительный XPath более согласован по сравнению с абсолютным XPath. Абсолютный XPath может перестать работать, если структура DOM изменится в будущем. Попробуйте приведенный ниже относительный XPath:
showmore_button = driver.find_element(By.XPATH, '//span[contains(text(),"Show more reviews")]')
driver.execute_script("arguments[0].click();", showmore_button)
Чтобы щелкнуть элемент Show more reviews внизу страницы, вам нужно scrollIntoView() вызвать WebDriverWait для visible_of_element_located() , и вы можете использовать следующие стратегии локатора:
Блок кода:
driver.get('https://www.goodreads.com/book/show/2767052-the-hunger-games/reviews?')
time.sleep(5)
driver.execute_script("return arguments[0].scrollIntoView(true);", WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='ReviewsList__listContext ReviewsList__listContext--centered']//span[contains(., 'Displaying 1 -')]"))))
driver.execute_script("arguments[0].click();", driver.find_element(By.XPATH, "//span[text()='Show more reviews']"))
Примечание. Вы должны добавить следующие импорты:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
Снимок браузера:

Откуда вы взяли этот путь и почему вы нажимаете не на кнопку, а на элемент span?