首页 > 解决方案 > 滚动到 Selenium (Python) 中的下一个元素

问题描述

我正在尝试在 Python 中的 Selenium 中制作一个 facebook 评论机器人。我需要向下滚动到在评论中上传照片的按钮才能发表评论,我有这行代码:

ActionChains(driver).move_to_element(driver.find_element_by_id('my-id')).perform()

当我再次运行它时,它会滚动到同一个按钮,我需要滚动到下一个按钮。还有另一个问题:这个按钮没有id。有什么办法吗?

标签: pythonselenium

解决方案


因此,为了滚动到多个元素,您需要使用该driver.execute_script()方法。如果您有驱动程序并且打开了页面,则需要隔离要导航到的元素。

element = driver.find_element(By.XPATH, "Whatever xpath you want")
driver.execute_script("return arguments[0].scrollIntoView();", element)

一旦你有了这个,你将需要计算你想要滚动的所有元素。例如,在Top 100 Greatest Movies List网站中,我创建了一个方法来获取当前显示的电影数量

def get_movie_count(self):
        return self.driver.find_elements(By.XPATH, "//div[@class='lister-list']//div[contains(@class, 'mode-detail')]").__len__()

之后,我创建了另一种滚动到我的元素的方法

def scroll_to_element(self, xpath : str):
        element = self.driver.find_element(By.XPATH, xpath)
        self.driver.execute_script("return arguments[0].scrollIntoView();", element)

完成后,我创建了一个for-loop并滚动到每个元素

for row in range(movieCount):
    driver.scroll_to_element("//div[@class='lister-list']//div[contains(@class, 'mode-detail')][{0}]".format(row + 1))

更新:添加照片以提供帮助 滚动浏览 100 个元素的示例程序

照片说明
在这张照片中,我们有我们的WebDriver班级。这是创建我们的 Chrome WebDriver 并包含我们想要的任何选项的类。就我而言,我不想一直看到“这由自动化控制”警报。

WebDriver课堂上,我有一个名为的方法,wait_displayed它使用. 如果该元素存在于浏览器的中,则一切正常。否则,会引发一个并让我知道找不到我的元素。在这个类中,我包含了允许我的 chrome 驱动程序在页面上查找元素并执行代码以滚动到找到的元素的方法。seleniumDOMxpathDOMpythonExceptionseleniumscroll_to_elementJavaScript

SampleSite类中,我们继承WebDriver类。这意味着我的SampleSite班级可以使用班级中显示的方法WebDriver。(like wait_displayedand scroll_to_element) 在SampleSite课堂上,我提供了一个optional parameterin it 的constructor方法。( __init__()) 这个可选参数告诉程序员,如果他们想创建一个instanceobjectSampleSite,他们需要,或者,传入一个现有的 chrome 驱动程序;或者,通过课程将打开 Google ChromeNoneSampleSite导航到我们的 100 部最伟大的电影页面。这是我创建def get_movie_count(self):方法的类。

在我们的main_program.py文件中,我导入了我们的SampleSite类。导入后,我创建了我们类的一个实例并调用了该get_movie_count方法。一旦该方法返回了我的电影计数 ( 100 ),我创建了一个for-loop滚动浏览每个元素的方法。


推荐阅读