Как использовать selenium ChromeDriver для прокрутки боковой панели на картах Google, чтобы загрузить больше результатов?

#python #html #selenium #selenium-webdriver #scroll

Вопрос:

Я столкнулся с проблемой, пытаясь использовать Selenium ChromeDriver для прокрутки боковой панели страницы результатов Google maps. Я пытаюсь перейти к 6-му результату, но результат не загружается полностью, пока вы не прокрутите вниз. Используя этот find_element_by_xpath метод, я успешно могу получить доступ к результатам 1-5 и щелкнуть по ним по отдельности, но при попытке использовать actions.move_to_element(link).perform() метод для прокрутки до 6-го элемента он не работает и выдает сообщение об ошибке.

Ошибка, которую я получаю: selenium.common.исключения.Исключение NoSuchElementException: Сообщение: такого элемента нет: Не удается найти элемент:

Однако я знаю, что этот элемент существует, потому что, когда я прокручиваю вручную и загружаю больше результатов, Xpath работает правильно. Что я делаю не так? Я потратил много часов, пытаясь решить эту проблему, и мне не удалось решить ее с помощью доступного контента. Я ценю любую помощь или идеи, которые вы можете предложить, спасибо!

 from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup as soup
import time

PATH = "C:Program Files (x86)chromedriver.exe"
driver = webdriver.Chrome(PATH)

driver.get("https://www.google.com/maps")
time.sleep(7)
page = soup(driver.page_source, 'html.parser')

#find the searchbar, enter search, and hit return
search = driver.find_element_by_id('searchboxinput')
search.send_keys("dentists in Austin Texas")
search.send_keys(Keys.RETURN)
driver.maximize_window() 

time.sleep(7)

#I want to get the 6th result down but it requires a sidebar scroll to load
link = driver.find_element_by_xpath("//*[@id='pane']/div/div[1]/div/div/div[4]/div[1]/div[13]/div/a")

actions.move_to_element(link).perform()

link.click()

time.sleep(5)

driver.back()```
 

Комментарии:

1. document.getElementById('id').scrollDown = big_value работает ли использование?

2. Спасибо за ответ, я просто попробовал, и это не сработало

Ответ №1:

Результаты поиска на карте Google расположены с //div[contains(@aria-label,'dentists in Austin Texas')]//div[contains(@jsaction,'mouseover')] помощью XPath.
Таким образом, чтобы выбрать там 6-й элемент, вы можете сделать следующее

 from selenium.webdriver.common.action_chains import ActionChains

results = driver.find_elements_by_xpath('//div[contains(@aria-label,"dentists in Austin Texas")]//div[contains(@jsaction,"mouseover")]')

ActionChains(driver).move_to_element(results[6]).click(button).perform()
 

Комментарии:

1. Спасибо за ответ, при использовании вашего кода я все равно получаю и индексирую код ошибки. ActionChains(driver).move_to_element(results[6]).click().perform() IndexError: list index out of range Этот код отлично работал для первых 4 результатов поиска, но по какой-то причине он все еще не прокручивается вниз, чтобы загрузить 6-й результат. Есть еще какие-нибудь идеи? Или я неправильно реализую предложенный вами код?

2. Вы должны добавить некоторую задержку / ожидание / сон после нажатия на кнопку поиска, прежде чем получить список результатов.

3. Если это не поможет, попробуйте выполнить перемещение мыши без щелчка, затем дайте небольшую задержку, а затем нажмите на элемент

4. Хорошие идеи по обоим, оба из которых я уже пробовал ранее. Таким образом, я могу навести курсор и заставить мышь перемещаться по первым пяти элементам результата, но как только я доберусь до 6-го, он скажет IndexError: list index out of range

Ответ №2:

Я нашел решение, которое работает, это нацелить элемент в XPATH из интерфейса javascript selenium. Затем вы должны выполнить две команды в инструкции (таргетинг и прокрутка).

 driver.executeScript("var el = document.evaluate('/html/body/jsl/div[3]/div[10]/div[8]/div/div[1]/div/div/div[4]/div[1]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; el.scroll(0, 5000);");
 

это единственное решение, которое сработало для меня