#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);");
это единственное решение, которое сработало для меня