Как нажать кнопку для сканирования отзывов с помощью python

Я пытаюсь просмотреть отзывы на этом сайте: https://www.bol.com/nl/p/Matras-140x200-7-zones-koudschuim-premium-plus-tijk-15-cm-medium/9200000118425897 /.

Однако мне нужно нажать кнопку ( Toon meer ), чтобы показать все отзывы.

<div class = "load-more load-more--divider load-more--reviews js-review-load-more-container">
  <a data-href = "/nl/rnwy/productPage/reviews?productId=9200000118425896&amp;offset=5&amp;limit=10&amp;loadMore=true" class = "review-load-more__button js-review-load-more-button" data-test = "review-load-more"><div class = "css-loader css-loader--reviews"></div>
      Toon meer</a>
</div>

Я использую приведенный ниже код:

import requests
import pandas as pd
from selenium import webdriver
from bs4 import BeautifulSoup
from datetime import datetime

start_time = datetime.now()
data = []
link = "https://www.bol.com/nl/p/Matras-140x200-7-zones-koudschuim-premium-plus-tijk-15-cm-medium/9200000118425897/"
op = webdriver.ChromeOptions()
op.add_argument('--ignore-certificate-errors')
op.add_argument('--incognito')
op.add_argument('--headless')
driver = webdriver.Chrome(executable_path='D:/Desktop/work/real/chromedriver.exe',options=op)
driver.get(link)
driver.find_element_by_css_selector('div.review-load-more__button js-review-load-more-button').click()

Однако выдает ошибку:

No such element: Unable to locate element: {"method":"css selector","selector":"div.review-load-more__button js-review-load-more-button"} . 

Есть ли решение?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
405
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Селекторы Css не могут выбрать элемент, содержащий текст.

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

wait = WebDriverWait(driver, 10)
wait.until(expected_conditions.element_to_be_clickable((By.XPATH, "//a[contains(., 'Toon meer')]")).click()

Я попробовал ваше решение, и оно выдало ошибку: щелчок по элементу перехвачен: элемент не доступен для клика в точке (202, 1865). Что это значит ?

mht 09.12.2020 16:27

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

Mate Mrše 09.12.2020 16:34

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

driver.get('https://www.bol.com/nl/p/Matras-140x200-7-zones-koudschuim-premium-plus-tijk-15-cm-medium/9200000118425896/')
wait=WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@class='js-confirm-button']"))).click()
wait.until(EC.element_to_be_clickable((By.XPATH, "//a[@data-test='review-load-more']"))).click()

Импортировать

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC
Ответ принят как подходящий

Чтобы щелкнуть Toon meer, вам нужно вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать одну из следующих стратегий локатора:

  • Использование CSS_SELECTOR:

    driver.get('https://www.bol.com/nl/p/Matras-140x200-7-zones-koudschuim-premium-plus-tijk-15-cm-medium/9200000118425896/')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-test='consent-modal-confirm-btn']>span"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.review-load-more__button.js-review-load-more-button"))).click()
    
  • Использование XPATH:

    driver.get('https://www.bol.com/nl/p/Matras-140x200-7-zones-koudschuim-premium-plus-tijk-15-cm-medium/9200000118425896/')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@data-test='consent-modal-confirm-btn']/span"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='review-load-more__button js-review-load-more-button' and contains(., 'Toon meer')]"))).click()
    
  • Примечание. Вы должны добавить следующие импорты:

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

Спасибо за комплексное решение. Я пытался запустить с помощью css_selector. Однако иногда он может нажать кнопку, иногда нет. Я не знаю почему. Должен ли я увеличить время ожидания?

mht 10.12.2020 20:08

@mht Да, это зависит от сетевого подключения. Мне удалось сократить время ожидания до 20 секунд. Возможно, вам придется отрегулировать.

undetected Selenium 10.12.2020 20:10

Как определить время ожидания? Как я могу получить подключение к сети (я думаю, это число?)?

mht 10.12.2020 20:13

@mht Извинения, вместо подключения к сети мы должны рассматривать это как время, необходимое для отображения желаемого элемента в HTML, и это конкретное значение должно быть частью вашего плана тестирования / тестового примера.

undetected Selenium 10.12.2020 20:58

Другие вопросы по теме