Я пытаюсь просмотреть отзывы на этом сайте: 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&offset=5&limit=10&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"} .
Есть ли решение?
Селекторы Css не могут выбрать элемент, содержащий текст.
Попробуйте использовать xpath. Последняя строка вашего скрипта должна выглядеть примерно так:
wait = WebDriverWait(driver, 10)
wait.until(expected_conditions.element_to_be_clickable((By.XPATH, "//a[contains(., 'Toon meer')]")).click()
это означает, что другой элемент (невидимый) блокирует клик. Добавьте условие ожидания, как в обновленном ответе.
Когда вы получаете страницу, появляется всплывающее окно с кнопкой принятия, нажмите ее, а затем продолжите щелкать свой элемент.
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 Да, это зависит от сетевого подключения. Мне удалось сократить время ожидания до 20
секунд. Возможно, вам придется отрегулировать.
Как определить время ожидания? Как я могу получить подключение к сети (я думаю, это число?)?
@mht Извинения, вместо подключения к сети мы должны рассматривать это как время, необходимое для отображения желаемого элемента в HTML, и это конкретное значение должно быть частью вашего плана тестирования / тестового примера.
Я попробовал ваше решение, и оно выдало ошибку: щелчок по элементу перехвачен: элемент не доступен для клика в точке (202, 1865). Что это значит ?