mirror of
https://gitee.com/g1879/DrissionPage.git
synced 2024-12-10 04:00:23 +08:00
DriverPage和DriverElement用scroll代替scroll_to()
This commit is contained in:
parent
c7124fd04c
commit
afaed79e5b
@ -30,6 +30,7 @@ class DriverElement(DrissionElement):
|
|||||||
"""
|
"""
|
||||||
super().__init__(ele, page)
|
super().__init__(ele, page)
|
||||||
self._select = None
|
self._select = None
|
||||||
|
self._scroll = None
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
attrs = [f"{attr}='{self.attrs[attr]}'" for attr in self.attrs]
|
attrs = [f"{attr}='{self.attrs[attr]}'" for attr in self.attrs]
|
||||||
@ -240,6 +241,13 @@ class DriverElement(DrissionElement):
|
|||||||
|
|
||||||
return self._select
|
return self._select
|
||||||
|
|
||||||
|
@property
|
||||||
|
def scroll(self) -> 'Scroll':
|
||||||
|
"""用于滚动滚动条的对象"""
|
||||||
|
if self._scroll is None:
|
||||||
|
self._scroll = Scroll(self)
|
||||||
|
return self._scroll
|
||||||
|
|
||||||
def left(self, index: int = 1, filter_loc: Union[tuple, str] = '') -> 'DriverElement':
|
def left(self, index: int = 1, filter_loc: Union[tuple, str] = '') -> 'DriverElement':
|
||||||
"""获取网页上显示在当前元素左边的某个元素,可设置选取条件,可指定结果中第几个 \n
|
"""获取网页上显示在当前元素左边的某个元素,可设置选取条件,可指定结果中第几个 \n
|
||||||
:param index: 获取第几个
|
:param index: 获取第几个
|
||||||
@ -483,34 +491,34 @@ class DriverElement(DrissionElement):
|
|||||||
:param pixel: 滚动的像素
|
:param pixel: 滚动的像素
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
|
from warnings import warn
|
||||||
|
warn("此方法下个版本将停用,请用scroll属性代替。", DeprecationWarning, stacklevel=2)
|
||||||
if mode == 'top':
|
if mode == 'top':
|
||||||
self.run_script("arguments[0].scrollTo(arguments[0].scrollLeft,0);")
|
self.scroll.top()
|
||||||
|
|
||||||
elif mode == 'bottom':
|
elif mode == 'bottom':
|
||||||
self.run_script("arguments[0].scrollTo(arguments[0].scrollLeft,arguments[0].scrollHeight);")
|
self.scroll.bottom()
|
||||||
|
|
||||||
elif mode == 'half':
|
elif mode == 'half':
|
||||||
self.run_script("arguments[0].scrollTo(arguments[0].scrollLeft,arguments[0].scrollHeight/2);")
|
self.scroll.half()
|
||||||
|
|
||||||
elif mode == 'rightmost':
|
elif mode == 'rightmost':
|
||||||
self.run_script("arguments[0].scrollTo(arguments[0].scrollWidth,arguments[0].scrollTop);")
|
self.scroll.rightmost()
|
||||||
|
|
||||||
elif mode == 'leftmost':
|
elif mode == 'leftmost':
|
||||||
self.run_script("arguments[0].scrollTo(0,arguments[0].scrollTop);")
|
self.scroll.leftmost()
|
||||||
|
|
||||||
elif mode == 'up':
|
elif mode == 'up':
|
||||||
pixel = pixel if pixel >= 0 else -pixel
|
self.scroll.up(pixel)
|
||||||
self.run_script(f"arguments[0].scrollBy(0,{pixel});")
|
|
||||||
|
|
||||||
elif mode == 'down':
|
elif mode == 'down':
|
||||||
self.run_script(f"arguments[0].scrollBy(0,{pixel});")
|
self.scroll.down(pixel)
|
||||||
|
|
||||||
elif mode == 'left':
|
elif mode == 'left':
|
||||||
pixel = pixel if pixel >= 0 else -pixel
|
self.scroll.left(pixel)
|
||||||
self.run_script(f"arguments[0].scrollBy({pixel},0);")
|
|
||||||
|
|
||||||
elif mode == 'right':
|
elif mode == 'right':
|
||||||
self.run_script(f"arguments[0].scrollBy({pixel},0);")
|
self.scroll.right(pixel)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise ValueError("mode参数只能是'top', 'bottom', 'half', 'rightmost', "
|
raise ValueError("mode参数只能是'top', 'bottom', 'half', 'rightmost', "
|
||||||
@ -1125,3 +1133,78 @@ def _wait_ele(page_or_ele,
|
|||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
class Scroll(object):
|
||||||
|
"""用于滚动的对象"""
|
||||||
|
|
||||||
|
def __init__(self, page_or_ele):
|
||||||
|
"""
|
||||||
|
:param page_or_ele: DriverPage或DriverElement
|
||||||
|
"""
|
||||||
|
self.driver = page_or_ele
|
||||||
|
if isinstance(page_or_ele, DriverElement):
|
||||||
|
self.t1 = self.t2 = 'arguments[0]'
|
||||||
|
else:
|
||||||
|
self.t1 = 'window'
|
||||||
|
self.t2 = 'document.documentElement'
|
||||||
|
|
||||||
|
def top(self) -> None:
|
||||||
|
"""滚动到顶端,水平位置不变"""
|
||||||
|
self.driver.run_script(f'{self.t1}.scrollTo({self.t2}.scrollLeft,0);')
|
||||||
|
|
||||||
|
def bottom(self) -> None:
|
||||||
|
"""滚动到底端,水平位置不变"""
|
||||||
|
self.driver.run_script(f'{self.t1}.scrollTo({self.t2}.scrollLeft,{self.t2}.scrollHeight);')
|
||||||
|
|
||||||
|
def half(self) -> None:
|
||||||
|
"""滚动到垂直中间位置,水平位置不变"""
|
||||||
|
self.driver.run_script(f'{self.t1}.scrollTo({self.t2}.scrollLeft,{self.t2}.scrollHeight/2);')
|
||||||
|
|
||||||
|
def rightmost(self) -> None:
|
||||||
|
"""滚动到最右边,垂直位置不变"""
|
||||||
|
self.driver.run_script(f'{self.t1}.scrollTo({self.t2}.scrollWidth,{self.t2}.scrollTop);')
|
||||||
|
|
||||||
|
def leftmost(self) -> None:
|
||||||
|
"""滚动到最左边,垂直位置不变"""
|
||||||
|
self.driver.run_script(f'{self.t1}.scrollTo(0,{self.t2}.scrollTop);')
|
||||||
|
|
||||||
|
def up(self, pixel: int = 300) -> None:
|
||||||
|
"""向上滚动若干像素,水平位置不变 \n
|
||||||
|
:param pixel: 滚动的像素
|
||||||
|
:return: None
|
||||||
|
"""
|
||||||
|
if pixel < 0:
|
||||||
|
self.down(-pixel)
|
||||||
|
else:
|
||||||
|
self.driver.run_script(f'{self.t1}.scrollBy(0,-{pixel});')
|
||||||
|
|
||||||
|
def down(self, pixel: int = 300) -> None:
|
||||||
|
"""向下滚动若干像素,水平位置不变 \n
|
||||||
|
:param pixel: 滚动的像素
|
||||||
|
:return: None
|
||||||
|
"""
|
||||||
|
if pixel < 0:
|
||||||
|
self.up(-pixel)
|
||||||
|
else:
|
||||||
|
self.driver.run_script(f'{self.t1}.scrollBy(0,{pixel});')
|
||||||
|
|
||||||
|
def left(self, pixel: int = 300) -> None:
|
||||||
|
"""向左滚动若干像素,水平位置不变 \n
|
||||||
|
:param pixel: 滚动的像素
|
||||||
|
:return: None
|
||||||
|
"""
|
||||||
|
if pixel < 0:
|
||||||
|
self.right(-pixel)
|
||||||
|
else:
|
||||||
|
self.driver.run_script(f'{self.t1}.scrollBy(-{pixel},0);')
|
||||||
|
|
||||||
|
def right(self, pixel: int = 300) -> None:
|
||||||
|
"""向右滚动若干像素,水平位置不变 \n
|
||||||
|
:param pixel: 滚动的像素
|
||||||
|
:return: None
|
||||||
|
"""
|
||||||
|
if pixel < 0:
|
||||||
|
self.left(-pixel)
|
||||||
|
else:
|
||||||
|
self.driver.run_script(f'{self.t1}.scrollBy({pixel},0);')
|
||||||
|
@ -18,7 +18,7 @@ from selenium.webdriver.support.wait import WebDriverWait
|
|||||||
|
|
||||||
from .base import BasePage
|
from .base import BasePage
|
||||||
from .common import get_usable_path
|
from .common import get_usable_path
|
||||||
from .driver_element import DriverElement, make_driver_ele, _wait_ele
|
from .driver_element import DriverElement, make_driver_ele, _wait_ele, Scroll
|
||||||
from .session_element import make_session_ele
|
from .session_element import make_session_ele
|
||||||
|
|
||||||
|
|
||||||
@ -30,6 +30,7 @@ class DriverPage(BasePage):
|
|||||||
super().__init__(timeout)
|
super().__init__(timeout)
|
||||||
self._driver = driver
|
self._driver = driver
|
||||||
self._wait_object = None
|
self._wait_object = None
|
||||||
|
self._scroll = None
|
||||||
|
|
||||||
def __call__(self, loc_or_str: Union[Tuple[str, str], str, DriverElement, WebElement],
|
def __call__(self, loc_or_str: Union[Tuple[str, str], str, DriverElement, WebElement],
|
||||||
timeout: float = None) -> Union[DriverElement, List[DriverElement], str]:
|
timeout: float = None) -> Union[DriverElement, List[DriverElement], str]:
|
||||||
@ -61,6 +62,13 @@ class DriverPage(BasePage):
|
|||||||
from json import loads
|
from json import loads
|
||||||
return loads(self('t:pre').text)
|
return loads(self('t:pre').text)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def scroll(self) -> Scroll:
|
||||||
|
"""用于滚动滚动条的对象"""
|
||||||
|
if self._scroll is None:
|
||||||
|
self._scroll = Scroll(self)
|
||||||
|
return self._scroll
|
||||||
|
|
||||||
def get(self,
|
def get(self,
|
||||||
url: str,
|
url: str,
|
||||||
go_anyway: bool = False,
|
go_anyway: bool = False,
|
||||||
@ -442,36 +450,34 @@ class DriverPage(BasePage):
|
|||||||
:param pixel: 滚动的像素
|
:param pixel: 滚动的像素
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
|
from warnings import warn
|
||||||
|
warn("此方法下个版本将停用,请用scroll属性代替。", DeprecationWarning, stacklevel=2)
|
||||||
if mode == 'top':
|
if mode == 'top':
|
||||||
self.driver.execute_script("window.scrollTo(document.documentElement.scrollLeft,0);")
|
self.scroll.top()
|
||||||
|
|
||||||
elif mode == 'bottom':
|
elif mode == 'bottom':
|
||||||
self.driver.execute_script(
|
self.scroll.bottom()
|
||||||
"window.scrollTo(document.documentElement.scrollLeft,document.body.scrollHeight);")
|
|
||||||
|
|
||||||
elif mode == 'half':
|
elif mode == 'half':
|
||||||
self.driver.execute_script(
|
self.scroll.half()
|
||||||
"window.scrollTo(document.documentElement.scrollLeft,document.body.scrollHeight/2);")
|
|
||||||
|
|
||||||
elif mode == 'rightmost':
|
elif mode == 'rightmost':
|
||||||
self.driver.execute_script("window.scrollTo(document.body.scrollWidth,document.documentElement.scrollTop);")
|
self.scroll.rightmost()
|
||||||
|
|
||||||
elif mode == 'leftmost':
|
elif mode == 'leftmost':
|
||||||
self.driver.execute_script("window.scrollTo(0,document.documentElement.scrollTop);")
|
self.scroll.leftmost()
|
||||||
|
|
||||||
elif mode == 'up':
|
elif mode == 'up':
|
||||||
pixel = pixel if pixel >= 0 else -pixel
|
self.scroll.up(pixel)
|
||||||
self.driver.execute_script(f"window.scrollBy(0,{pixel});")
|
|
||||||
|
|
||||||
elif mode == 'down':
|
elif mode == 'down':
|
||||||
self.driver.execute_script(f"window.scrollBy(0,{pixel});")
|
self.scroll.down(pixel)
|
||||||
|
|
||||||
elif mode == 'left':
|
elif mode == 'left':
|
||||||
pixel = pixel if pixel >= 0 else -pixel
|
self.scroll.left(pixel)
|
||||||
self.driver.execute_script(f"window.scrollBy({pixel},0);")
|
|
||||||
|
|
||||||
elif mode == 'right':
|
elif mode == 'right':
|
||||||
self.driver.execute_script(f"window.scrollBy({pixel},0);")
|
self.scroll.right(pixel)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise ValueError("mode参数只能是'top', 'bottom', 'half', 'rightmost', "
|
raise ValueError("mode参数只能是'top', 'bottom', 'half', 'rightmost', "
|
||||||
|
@ -51,6 +51,7 @@ class MixPage(SessionPage, DriverPage, BasePage):
|
|||||||
self._drission = drission or Drission(driver_options, session_options)
|
self._drission = drission or Drission(driver_options, session_options)
|
||||||
self._wait_object = None
|
self._wait_object = None
|
||||||
self._response = None
|
self._response = None
|
||||||
|
self._scroll = None
|
||||||
|
|
||||||
if self._mode == 'd':
|
if self._mode == 'd':
|
||||||
try:
|
try:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user