如何使用selenium python find_elements方法只找到视口中的WebElement?

f5emj3cl  于 2023-02-08  发布在  Python
关注(0)|答案(1)|浏览(174)

我想自动滚动网页并点击按钮的任务。但是,当尝试使用driver.find_elements()查找网页元素时,会获取视口中不存在的所有网页元素的列表,因此点击它们会导致错误“MoveTargetOutOfBounds”

def like(self):
        likeButtonXpath = '//div[@aria-label="Like"]'
        try:
            a = ActionChains(self.browser)
            likeWebElements = self.browser.find_elements(
                By.XPATH, likeButtonXpath)
            for element in likeWebElements:
                try:
                    a.move_to_element(element).perform()
                    sleep(3)
                    element.click()
                except:
                    print("error while clicking button")
        except Exception as e:
            print(e)

    def scrollLike(self):
        last_height = self.browser.execute_script(
            "return document.body.scrollHeight")
        cnt = self.maxScroll
        curHeight = last_height
        while cnt >= 0:
            self.like()
            self.browser.execute_script("window.scrollBy(0,1000)", "")
            sleep(30)
            new_height = self.browser.execute_script(
                "return document.body.scrollHeight")
            if new_height == last_height:
                break
            last_height = new_height
            cnt -= 1
aiazj4mn

aiazj4mn1#

不可能告诉driver.find_elements限制它在视区中的元素上搜索。一个可能的解决方案是计算元素的坐标,然后滚动到它们,但这通常是一项艰巨的任务,几乎不可能得到精确的坐标。
使用javascript和scrollIntoView,我们可以很容易地将所需的元素放入视口中。

driver.execute_script('arguments[0].scrollIntoView();', element)

通过添加block: "center",滚动将以元素位于视口中心的方式执行。通过添加behavior: "smooth",滚动将变得平滑。

driver.execute_script('arguments[0].scrollIntoView({block: "center", behavior: "smooth"});', element)

相关问题