调整格式

This commit is contained in:
g1879 2020-11-10 23:40:27 +08:00
parent 9b3158b866
commit 42263e16c1
3 changed files with 180 additions and 151 deletions

View File

@ -251,13 +251,14 @@ class DriverElement(DrissionElement):
"""返回当前元素的::after伪元素内容""" """返回当前元素的::after伪元素内容"""
return self.get_style_property('content', 'after') return self.get_style_property('content', 'after')
def get_style_property(self, style: str, pseudo_ele: str = None) -> str: def get_style_property(self, style: str, pseudo_ele: str = '') -> str:
"""返回元素样式属性值 """返回元素样式属性值
:param style: 样式属性名称 :param style: 样式属性名称
:param pseudo_ele: 伪元素名称 :param pseudo_ele: 伪元素名称
:return: 样式属性的值 :return: 样式属性的值
""" """
pseudo_ele = f', "::{pseudo_ele}"' if pseudo_ele else '' if pseudo_ele:
pseudo_ele = f', "{pseudo_ele}"' if pseudo_ele.startswith(':') else f', "::{pseudo_ele}"'
r = self.run_script(f'return window.getComputedStyle(arguments[0]{pseudo_ele}).getPropertyValue("{style}");') r = self.run_script(f'return window.getComputedStyle(arguments[0]{pseudo_ele}).getPropertyValue("{style}");')
return None if r == 'none' else r return None if r == 'none' else r

View File

@ -90,6 +90,39 @@ class MixPage(Null, SessionPage, DriverPage):
"""返回当前模式,'s''d' """ """返回当前模式,'s''d' """
return self._mode return self._mode
@property
def drission(self) -> Drission:
"""返回当前使用的Dirssion对象"""
return self._drission
@property
def driver(self) -> WebDriver:
"""返回driver对象如没有则创建 \n
每次访问时切换到d模式用于独有函数及外部调用
:return: WebDriver对象
"""
self.change_mode('d')
return self._drission.driver
@property
def session(self) -> Session:
"""返回Session对象如没有则创建"""
return self._drission.session
@property
def response(self) -> Response:
"""返回s模式获取到的Response对象切换到s模式"""
self.change_mode('s')
return self._response
@property
def cookies(self) -> Union[dict, list]:
"""返回cookies"""
if self._mode == 's':
return super().cookies
elif self._mode == 'd':
return super(SessionPage, self).cookies
def change_mode(self, mode: str = None, go: bool = True) -> None: def change_mode(self, mode: str = None, go: bool = True) -> None:
"""切换模式,接收's''d'除此以外的字符串会切换为d模式 \n """切换模式,接收's''d'除此以外的字符串会切换为d模式 \n
切换时会把当前模式的cookies复制到目标模式 \n 切换时会把当前模式的cookies复制到目标模式 \n
@ -120,39 +153,6 @@ class MixPage(Null, SessionPage, DriverPage):
if go and self._drission.driver.current_url.startswith('http'): if go and self._drission.driver.current_url.startswith('http'):
self.get(self._drission.driver.current_url) self.get(self._drission.driver.current_url)
@property
def drission(self) -> Drission:
"""返回当前使用的Dirssion对象"""
return self._drission
@property
def driver(self) -> WebDriver:
"""返回driver对象如没有则创建 \n
每次访问时切换到d模式用于独有函数及外部调用
:return: WebDriver对象
"""
self.change_mode('d')
return self._drission.driver
@property
def session(self) -> Session:
"""返回Session对象如没有则创建"""
return self._drission.session
@property
def response(self) -> Response:
"""返回response对象切换到s模式"""
self.change_mode('s')
return self._response
@property
def cookies(self) -> Union[dict, list]:
"""返回cookies"""
if self._mode == 's':
return super().cookies
elif self._mode == 'd':
return super(SessionPage, self).cookies
def cookies_to_session(self, copy_user_agent: bool = False) -> None: def cookies_to_session(self, copy_user_agent: bool = False) -> None:
"""从driver复制cookies到session \n """从driver复制cookies到session \n
:param copy_user_agent : 是否复制user agent信息 :param copy_user_agent : 是否复制user agent信息
@ -193,7 +193,7 @@ class MixPage(Null, SessionPage, DriverPage):
**kwargs) -> Union[bool, None]: **kwargs) -> Union[bool, None]:
"""用post方式跳转到url会切换到s模式 \n """用post方式跳转到url会切换到s模式 \n
:param url: 目标url :param url: 目标url
:param data: 提交的数据 :param data: post方式时提交的数据
:param go_anyway: 若目标url与当前url一致是否强制跳转 :param go_anyway: 若目标url与当前url一致是否强制跳转
:param show_errmsg: 是否显示和抛出异常 :param show_errmsg: 是否显示和抛出异常
:param kwargs: 连接参数 :param kwargs: 连接参数
@ -210,11 +210,11 @@ class MixPage(Null, SessionPage, DriverPage):
post_data: dict = None, post_data: dict = None,
show_msg: bool = False, show_msg: bool = False,
show_errmsg: bool = False, show_errmsg: bool = False,
**kwargs) -> tuple: **kwargs) -> Tuple[bool, str]:
"""下载一个文件 \n """下载一个文件 \n
d模式下下载前先同步cookies \n d模式下下载前先同步cookies \n
:param file_url: 文件url :param file_url: 文件url
:param goal_path: 存放路径 :param goal_path: 存放路径默认为ini文件中指定的临时文件夹
:param rename: 重命名文件可不写扩展名 :param rename: 重命名文件可不写扩展名
:param file_exists: 若存在同名文件可选择 'rename', 'overwrite', 'skip' 方式处理 :param file_exists: 若存在同名文件可选择 'rename', 'overwrite', 'skip' 方式处理
:param post_data: post方式的数据 :param post_data: post方式的数据
@ -314,7 +314,7 @@ class MixPage(Null, SessionPage, DriverPage):
:param loc_or_ele: 元素的定位信息可以是元素对象loc元组或查询字符串 :param loc_or_ele: 元素的定位信息可以是元素对象loc元组或查询字符串
:param mode: 'single' 'all对应查找一个或全部 :param mode: 'single' 'all对应查找一个或全部
:param timeout: 查找元素超时时间d模式专用 :param timeout: 查找元素超时时间d模式专用
:return: 元素对象d模式为DriverElements模式为SessionElement :return: 元素对象或属性文本节点文本
""" """
if self._mode == 's': if self._mode == 's':
return super().ele(loc_or_ele, mode=mode) return super().ele(loc_or_ele, mode=mode)
@ -347,7 +347,7 @@ class MixPage(Null, SessionPage, DriverPage):
page.eles('css:div.ele_class') - 返回所有符合css selector的元素 \n page.eles('css:div.ele_class') - 返回所有符合css selector的元素 \n
:param loc_or_str: 元素的定位信息可以是loc元组或查询字符串 :param loc_or_str: 元素的定位信息可以是loc元组或查询字符串
:param timeout: 查找元素超时时间d模式专用 :param timeout: 查找元素超时时间d模式专用
:return: 元素对象组成的列表d模式下由DriverElement组成s模式下由SessionElement组成 :return: 元素对象或属性文本节点文本组成的列表
""" """
if self._mode == 's': if self._mode == 's':
return super().eles(loc_or_str) return super().eles(loc_or_str)

View File

@ -5,7 +5,7 @@
DrissionPage即driver和session的合体是个基于python的Web自动化操作集成工具。 DrissionPage即driver和session的合体是个基于python的Web自动化操作集成工具。
它实现了selenium和requests之间的无缝切换。 它实现了selenium和requests之间的无缝切换。
因此可以兼顾selenium的便利性和requests的高效率。 因此可以兼顾selenium的便利性和requests的高效率。
集成了页面常用功能两种模式系统一致的API使用便捷。 集成了页面常用功能两种模式系统一致的API使用便捷。
它用POM模式封装了页面元素常用的方法很适合自动化操作功能扩展。 它用POM模式封装了页面元素常用的方法很适合自动化操作功能扩展。
更棒的是,它的使用方式非常简洁和人性化,代码量少,对新手友好。 更棒的是,它的使用方式非常简洁和人性化,代码量少,对新手友好。
@ -32,6 +32,7 @@ DrissionPage即driver和session的合体是个基于python的Web自动化
*** ***
- 允许在selenium和requests间无缝切换共享session。 - 允许在selenium和requests间无缝切换共享session。
- 兼容selenium代码易于迁移。
- 使用POM模式封装常用方法便于扩展。 - 使用POM模式封装常用方法便于扩展。
- 两种模式提供统一的操作方法,使用体验一致。 - 两种模式提供统一的操作方法,使用体验一致。
- 人性化的页面元素操作方法,减轻页面分析工作量和编码量。 - 人性化的页面元素操作方法,减轻页面分析工作量和编码量。
@ -391,6 +392,32 @@ element.location # 元素位置
## 与selenium代码对接
DrissionPage代码可与selenium代码无缝拼接既可直接使用selenium的WebDriver对象也可到处自身的WebDriver给selenium代码使用。使已有项目的迁移非常方便。
### selenium转DrissionPage
```python
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
page = MixPage(Drission(driver)) # 把driver传递给Drission创建MixPage对象
print(page.title) # 打印结果:百度一下,你就知道
```
### DrissionPage转selenium
```python
page = MixPage()
page.get('https://www.baidu.com')
driver = page.driver # 从MixPage对象中获取WebDriver对象
print(driver.title) # 打印结果:百度一下,你就知道
```
## Chrome快捷设置 ## Chrome快捷设置
chrome的配置很繁琐为简化使用本库提供了常用配置的设置方法。 chrome的配置很繁琐为简化使用本库提供了常用配置的设置方法。
@ -708,8 +735,8 @@ Drission类用于管理WebDriver对象和Session对象是驱动器的角色
参数说明: 参数说明:
- copy_user_agent: bool - 是否复制user_agent到session - copy_user_agent: bool - 是否复制user_agent到session
- driver: WebDriver - WebDriver对象复制cookies - driver: WebDriver - 复制cookies的WebDriver对象
- session: Session - Session对象接收cookies - session: Session - 接收cookies的Session对象
返回: None 返回: None
@ -722,8 +749,8 @@ Drission类用于管理WebDriver对象和Session对象是驱动器的角色
参数说明: 参数说明:
- url: str - cookies的域 - url: str - cookies的域
- driver: WebDriver - WebDriver对象接收cookies - driver: WebDriver - 接收cookies的WebDriver对象
- session: Session - Session对象复制cookies - session: Session - 复制cookies的Session对象
返回: None 返回: None
@ -776,25 +803,25 @@ MixPage封装了页面操作的常用功能可在driver和session模式间无
参数说明: 参数说明:
- drission: Drission - Drission对象如没传入则创建一个。传入's'或'd'时快速配置相应模式 - drission: Drission - Drission对象如没传入则创建一个。传入 's' 'd' 时快速配置相应模式
- mode: str - 模式,可选'd'或's',默认为'd' - mode: str - 模式,可选 'd' 's',默认为'd'
- timeout: float - 超时时间driver模式查找元素时间及session模式连接时间 - timeout: float - 超时时间driver模式为查找元素时间session模式为连接等待时间
### url ### url
返回当前访问的url。 返回MixPage对象当前访问的url。
返回: 返回: str
### mode ### mode
返回当前模式('s'或'd')。 返回当前模式( 's' 'd' )。
返回: 返回: str
@ -802,7 +829,7 @@ MixPage封装了页面操作的常用功能可在driver和session模式间无
返回当前使用的Dirssion对象。 返回当前使用的Dirssion对象。
返回: 返回: Drission
@ -810,7 +837,7 @@ MixPage封装了页面操作的常用功能可在driver和session模式间无
返回driver对象如没有则创建调用时会切换到driver模式。 返回driver对象如没有则创建调用时会切换到driver模式。
返回: 返回: WebDriver
@ -818,15 +845,15 @@ MixPage封装了页面操作的常用功能可在driver和session模式间无
返回session对象如没有则创建。 返回session对象如没有则创建。
返回: 返回: Session
### response ### response
返回Response对象调用时会切换到session模式。 返回s模式获取到的Response对象调用时会切换到s模式。
返回: 返回: Response
@ -834,7 +861,7 @@ MixPage封装了页面操作的常用功能可在driver和session模式间无
返回cookies从当前模式获取。 返回cookies从当前模式获取。
返回: 返回: [dict, list]
@ -842,63 +869,50 @@ MixPage封装了页面操作的常用功能可在driver和session模式间无
返回页面html文本。 返回页面html文本。
返回: 返回: str
### title ### title
返回页面title文本 返回页面title。
返回: 返回: str
### url_available
返回当前url有效性。
返回: bool
### change_mode() ### change_mode()
change_mode(mode: str = None, go: bool = True) -> None 切换模式,'d' 或 's'。切换时会把当前模式的cookies复制到目标模式。
切换模式,可指定目标模式,若目标模式与当前模式一致,则直接返回。
参数说明: 参数说明:
- mode - 指定目标模式,'d'或's'。 - mode: str - 指定目标模式,'d' 's'。
- go - 切换模式后是否跳转到当前url - go: bool - 切换模式后是否跳转到当前url
返回: 返回: None
### get()
get(url: str, go_anyway=False, **kwargs) -> Union[bool, None]
跳转到一个url跳转前先同步cookies跳转后返回目标url是否可用。
参数说明:
- url - 目标url
- go_anyway - 是否强制跳转。若目标url和当前url一致默认不跳转。
- kwargs - 用于session模式时访问参数。
返回:
### ele() ### ele()
ele(loc_or_ele: Union[tuple, str, DriverElement, SessionElement], mode: str = None, timeout: float = None, show_errmsg: bool = False) -> Union[DriverElement, SessionElement]
返回页面中符合条件的元素,默认返回第一个。 返回页面中符合条件的元素,默认返回第一个。
​如查询参数是字符串,可选'@属性名:'、'tag:'、'text:'、'css:'、'xpath:'方式。无控制方式时默认用text方式查找。 ​如查询参数是字符串,可选'@属性名:'、'tag:'、'text:'、'css:'、'xpath:'方式。无控制方式时默认用text方式查找。
如是loc直接按照内容查询。 如是loc直接按照内容查询。
参数说明: 参数说明:
- loc_or_str - 元素的定位信息可以是元素对象loc元组或查询字符串 - loc_or_str: [Tuple[str, str], str, DriverElement, SessionElement, WebElement] - 元素的定位信息可以是元素对象loc元组或查询字符串
- mode - 'single' 或 'all对应查找一个或全部 - mode: str - 'single' 或 'all对应查找一个或全部
- timeout - 查找元素超时时间driver模式下有效 - timeout: float - 查找元素超时时间driver模式下有效
- show_errmsg - 出现异常时是否抛出及显示
示例: 示例:
@ -928,88 +942,96 @@ ele(loc_or_ele: Union[tuple, str, DriverElement, SessionElement], mode: str = No
- page.ele('xpath://div[@class="ele_class"]') - 返回第一个符合xpath的元素 - page.ele('xpath://div[@class="ele_class"]') - 返回第一个符合xpath的元素
- page.ele('css:div.ele_class') - 返回第一个符合css selector的元素 - page.ele('css:div.ele_class') - 返回第一个符合css selector的元素
返回: 返回: [DriverElement, SessionElement, str] - 元素对象或属性、文本节点文本
### eles() ### eles()
eles(loc_or_str: Union[tuple, str], timeout: float = None, show_errmsg: bool = False) -> List[DriverElement]
根据查询参数获取符合条件的元素列表。查询参数使用方法和ele方法一致。 根据查询参数获取符合条件的元素列表。查询参数使用方法和ele方法一致。
参数说明: 参数说明:
- loc_or_str - 查询条件参数 - loc_or_str: [Tuple[str, str], str] - 查询条件参数
- timeout - 查找元素超时时间driver模式下有效 - timeout: float - 查找元素超时时间driver模式下有效
- show_errmsg - 出现异常时是否抛出及显示
返回: 返回: [List[DriverElement or str], List[SessionElement or str]] - 元素对象或属性、文本节点文本组成的列表
### cookies_to_session() ### cookies_to_session()
cookies_to_session(copy_user_agent: bool = False) -> None 从WebDriver对象复制cookies到Session对象。
手动把cookies从driver复制到session。
参数说明: 参数说明:
- copy_user_agent - 是否同时复制user agent - copy_user_agent:bool - 是否同时复制user agent
返回: 返回: None
### cookies_to_driver() ### cookies_to_driver()
cookies_to_driver(url=None) -> None 从Session对象复制cookies到WebDriver对象。
手动把cookies从session复制到driver。
参数说明: 参数说明:
- url - cookies的域或url - url:str - cookies的域或url
返回: 返回: None
### get()
跳转到一个url跳转前先同步cookies跳转后返回目标url是否可用。
参数说明:
- url: str - 目标url
- go_anyway: bool - 是否强制跳转。若目标url和当前url一致默认不跳转。
- show_errmsg: bool - 是否显示和抛出异常
- retry: int - 连接出错时重试次数
- interval: float - 重试间隔(秒)
- **kwargs - 用于requests的连接参数
返回: [bool, None] - url是否可用
### post() ### post()
post(url: str, params: dict = None, data: dict = None, go_anyway: bool = False, **kwargs) -> Union[bool, None]
以post方式跳转调用时自动切换到session模式。 以post方式跳转调用时自动切换到session模式。
参数说明: 参数说明:
- url - 目标url - url:str - 目标url
- parame - url参数 - data: dict - 提交的数据
- data - 提交的数据 - go_anyway: bool - 是否强制跳转。若目标url和当前url一致默认不跳转。
- go_anyway - 是否强制跳转。若目标url和当前url一致默认不跳转。 - show_errmsg: bool - 是否显示和抛出异常
- kwargs - headers等访问参数 - **kwargs - 用于requests的连接参数
返回: 返回: [bool, None] - url是否可用
### download() ### download()
download(file_url: str, goal_path: str = None, rename: str = None, file_exists: str = 'rename', show_msg: bool = False, **kwargs) -> tuple
下载一个文件,返回是否成功和下载信息字符串。改方法会自动避免和目标路径现有文件重名。 下载一个文件,返回是否成功和下载信息字符串。改方法会自动避免和目标路径现有文件重名。
参数说明: 参数说明:
- file_url - 文件URL - file_url: str - 文件url
- goal_path - 存放路径默认为ini文件中指定的临时文件夹 - goal_path: str - 存放路径默认为ini文件中指定的临时文件夹
- rename - 重命名文件,不改变扩展名 - rename: str - 重命名文件,不改变扩展名
- file_exists - 若存在同名文件,可选择'rename', 'overwrite', 'skip'方式处理 - file_exists: str - 若存在同名文件,可选择 'rename', 'overwrite', 'skip' 方式处理
- show_msg - 是否显示下载信息 - post_data: dict - post方式时提交的数据
- kwargs - 用于requests的连接参数 - show_msg: bool - 是否显示下载信息
- show_errmsg: bool - 是否显示和抛出异常
- **kwargs - 用于requests的连接参数
返回: 返回: Tuple[bool, str] - 下载是否成功bool和状态信息成功时信息为文件路径的元组
@ -1021,7 +1043,7 @@ download(file_url: str, goal_path: str = None, rename: str = None, file_exists:
返回标签页数量。 返回标签页数量。
返回: 返回: int
@ -1029,7 +1051,7 @@ download(file_url: str, goal_path: str = None, rename: str = None, file_exists:
返回所有标签页handle列表。 返回所有标签页handle列表。
返回: 返回: list
@ -1037,7 +1059,7 @@ download(file_url: str, goal_path: str = None, rename: str = None, file_exists:
返回当前标签页序号。 返回当前标签页序号。
返回: 返回: int
@ -1045,50 +1067,56 @@ download(file_url: str, goal_path: str = None, rename: str = None, file_exists:
返回当前标签页handle。 返回当前标签页handle。
返回: 返回: str
### wait_ele()
等待元素从dom删除、显示、隐藏
参数说明:
- loc_or_ele: [str, tuple, DriverElement, WebElement] - 元素查找方式与ele()相同
- mode: str - 等待方式,可选:'del', 'display', 'hidden'
- timeout: float - 等待超时时间
### check_page() ### check_page()
check_page(by_requests: bool = False) -> Union[bool, None]
d模式时检查网页是否符合预期。默认由response状态检查可重载实现针对性检查。 d模式时检查网页是否符合预期。默认由response状态检查可重载实现针对性检查。
参数说明: 参数说明:
- by_requests - 强制使用内置response进行检查 - by_requests:bool - 强制使用内置response进行检查
返回: 返回: [bool, None] - bool为是否可用None为未知
### run_script() ### run_script()
run_script(script: str, *args) -> Any
执行JavaScript代码。 执行JavaScript代码。
参数说明: 参数说明:
- script - JavaScript代码文本 - script: str - JavaScript代码文本
- args - 传入的参数 - *args - 传入的参数
返回: 返回: Any
### create_tab() ### create_tab()
create_tab(url: str = '') -> None
新建并定位到一个标签页,该标签页在最后面。 新建并定位到一个标签页,该标签页在最后面。
参数说明: 参数说明:
- url - 新标签页跳转到的网址 - url:str - 新标签页跳转到的网址
返回: 返回: None
@ -1098,7 +1126,7 @@ close_current_tab() -> None
关闭当前标签页。 关闭当前标签页。
返回: 返回: None
@ -1112,7 +1140,7 @@ close_other_tabs(num_or_handle: Union[int, str, None] = None) -> None
- num_or_handle - 要保留的标签页序号或handle序号第一个为0最后为-1 - num_or_handle - 要保留的标签页序号或handle序号第一个为0最后为-1
返回: 返回: None
@ -1126,7 +1154,7 @@ to_tab(num_or_handle: Union[int, str] = 0) -> None
- num_or_handle - 标签页序号或handle字符串序号第一个为0最后为-1 - num_or_handle - 标签页序号或handle字符串序号第一个为0最后为-1
返回: 返回: None
@ -1149,7 +1177,7 @@ to_iframe(self, loc_or_ele: Union[int, str, tuple, WebElement, DriverElement] =
- to_iframe('main') - 跳到最高层 - to_iframe('main') - 跳到最高层
- to_iframe('parent') - 跳到上一层 - to_iframe('parent') - 跳到上一层
返回: 返回: None
@ -1163,7 +1191,7 @@ scroll_to_see(loc_or_ele: Union[str, tuple, WebElement, DriverElement]) -> None
- loc_or_ele - 查找iframe元素的条件和ele()方法的查找条件一致。 - loc_or_ele - 查找iframe元素的条件和ele()方法的查找条件一致。
返回: 返回: None
@ -1178,7 +1206,7 @@ scroll_to(mode: str = 'bottom', pixel: int = 300) -> None
- mode - 滚动的方向top、bottom、rightmost、leftmost、up、down、left、right - mode - 滚动的方向top、bottom、rightmost、leftmost、up、down、left、right
- pixel - 滚动的像素 - pixel - 滚动的像素
返回: 返回: None
@ -1188,7 +1216,7 @@ refresh() -> None
刷新页面。 刷新页面。
返回: 返回: None
@ -1198,7 +1226,7 @@ back() -> None
页面后退。 页面后退。
返回: 返回: None
@ -1213,7 +1241,7 @@ set_window_size(x: int = None, y: int = None) -> None
- x - 目标宽度 - x - 目标宽度
- y - 目标高度 - y - 目标高度
返回: 返回: None
@ -1228,7 +1256,7 @@ screenshot(path: str, filename: str = None) -> str
- path - 截图保存路径默认为ini文件中指定的临时文件夹 - path - 截图保存路径默认为ini文件中指定的临时文件夹
- filename - 截图文件名默认为页面title为文件名 - filename - 截图文件名默认为页面title为文件名
返回: 返回: str
@ -1279,7 +1307,7 @@ close_driver() -> None
### DriverElement类 ## DriverElement类
class DriverElement(ele: WebElement, timeout: float = 10) class DriverElement(ele: WebElement, timeout: float = 10)