案例
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)
就可以通过外部传参的方式传值
下面案例是操作禅道主页,内部滚动条的演示代码
- 先定位到内部滚动条
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)