【问题标题】:How do I use selenium ChromeDriver to scroll the sidebar on Google maps to load more results?如何使用 selenium ChromeDriver 在 Google 地图上滚动侧边栏以加载更多结果?
【发布时间】:2021-08-19 08:35:35
【问题描述】:

我在尝试使用 Selenium ChromeDriver 向下滚动 google 地图结果页面的侧边栏时遇到了问题。我正在尝试向下滚动到第 6 个结果,但在您向下滚动之前结果不会完全加载。使用find_element_by_xpath 方法,我成功地能够访问结果1-5 并单独单击它们,但是当尝试使用actions.move_to_element(link).perform() 方法滚动到第6 个元素时,它不起作用并引发错误消息。

我得到的错误是: selenium.common.exceptions.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()```

【问题讨论】:

  • 使用document.getElementById('id').scrollDown += big_value 有效吗?
  • 感谢回复,我刚试了,还是不行

标签: python html selenium selenium-webdriver scroll


【解决方案1】:

谷歌地图中的搜索结果位于//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()

【讨论】:

  • 感谢您的回复,当使用您的代码时,我仍然得到并索引错误代码。 ActionChains(driver).move_to_element(results[6]).click().perform() IndexError: list index out of range 虽然这段代码在前 4 个搜索结果中效果很好,但由于某种原因,它仍然没有向下滚动以加载第 6 个结果。还有其他想法吗?还是我没有正确实现您建议的代码?
  • 您应该在点击搜索按钮后添加一些延迟/等待/睡眠,然后才能获得结果列表。
  • 如果这不能帮助尝试在不点击的情况下执行鼠标移动,那么请稍等片刻,然后点击元素
  • 两者都不错,我之前都尝试过。所以我可以将鼠标悬停在前五个结果元素上,但一旦我到达第 6 个,它就会显示IndexError: list index out of range
【解决方案2】:

我找到了一个可行的解决方案,它是从 selenium 的 javascript 接口定位 XPATH 中的元素。然后您必须在一条指令上执行两个命令(定位和滚动)

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);");

这是唯一对我有用的解决方案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 2016-03-19
    • 2016-09-19
    相关资源
    最近更新 更多