十五 嵌套滚动条,如何滚动

案例

https://demo.zentao.net/my/ 禅道这个网页内还有滚动条,如果只操作外层滚动条直接使用scrollTo(x, y) 接可以。那么一个网页内部有多个滚动条,用全局的滚动,并不好使。

image.png

首先先定位到内部滚动的element,再使用element对象去调用scrollTo(x,y)去实现。
js=""
arguments[0].scrollTo(0,500);
""
driver.execute_script(js, ele)
scrollTo(x,y) 中的x,y参数我们可以传百分比x轴的最大宽度,和y轴的最大高度的百分比。
x = ele.scrollWidth * 0.5
y = ele.scrollHeight *0.5

所以js可以写成如下
js="" arguments[0].scrollTo(arguments[0].scrollWidth * arguments[1],arguments[0].scrollHeight * arguments[2]); ""
driver.execute_script(js, ele,0.5,0.5) 就可以通过外部传参的方式传值

下面案例是操作禅道主页,内部滚动条的演示代码

  1. 先定位到内部滚动条

2.再调用js操作滚动条

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from selenium.webdriver import ActionChains
import time

# 禅道内存 滚动条

url = "https://demo.zentao.net/my/"

driver = webdriver.Chrome()
driver.maximize_window()

driver.get("https://demo.zentao.net/my/")
time.sleep(3)

try:
    time.sleep(3)
    # 定位到内层滚动条
    loc = (By.XPATH, """//div[@class='panel block-sm block-dynamic ']//div[contains(@class,"panel-body")]""")
    el = driver.find_element(*loc)
    time.sleep(2)

    driver.execute_script("arguments[0].scrollTo(arguments[0].scrollWidth * 0.5, arguments[0].scrollHeight * 0.5)", el)
    time.sleep(3)
except (TimeoutException, NoSuchElementException) as e:
    print(f"发生异常 :{e}")
finally:
    driver.quit()


封装

import time
from selenium.webdriver import Remote, Chrome
from selenium.webdriver.remote.webelement import WebElement


class SeleniumUpAPI:
    """Selenium的上层封装"""

    def __init__(self, driver: Remote):
        self.driver = driver

    def element_scroll_to(self, el: WebElement, x_percent=0, y_percent=0):
        """滚动元素到百分比位置.
        x: 宽度的比率,0.5
        y: 高度的比率,0.5
        """
        self.driver.execute_script(
            "arguments[0].scrollTo(arguments[0].scrollWidth * arguments[1], arguments[0].scrollHeight * arguments[2])",
            el, x_percent, y_percent)
    def element_scroll_by(self, el: WebElement, x_percent=0, y_percent=0):
        """每次滚动多少个像素点,以元素百分比操作
        x: 宽度的比率,0.1
        y: 高度的比率,0.1
        """
        self.driver.execute_script(
            "arguments[0].scrollBy(arguments[0].scrollWidth * arguments[1], arguments[0].scrollHeight * arguments[2])",
            el, x_percent, y_percent)



你可能感兴趣的:(十五 嵌套滚动条,如何滚动)