连接函数增加show_errmsg参数

This commit is contained in:
g1879 2020-08-14 00:27:31 +08:00
parent 2ab3b7b5cb
commit 016d54561c
3 changed files with 75 additions and 24 deletions

View File

@ -60,10 +60,11 @@ class DriverPage(object):
"""返回网页title"""
return self.driver.title
def get(self, url: str, go_anyway: bool = False) -> Union[None, bool]:
def get(self, url: str, go_anyway: bool = False, show_errmsg: bool = False) -> Union[None, bool]:
"""访问url \n
:param url: 目标url
:param go_anyway: 若目标url与当前url一致是否强制跳转
:param show_errmsg: 是否显示和抛出异常
:return: 目标url是否可用
"""
to_url = quote(url, safe='/:&?=%;#@')
@ -72,6 +73,8 @@ class DriverPage(object):
self._url = to_url
self.driver.get(to_url)
self._url_available = self.check_page()
if self._url_available is False and show_errmsg:
raise ConnectionError('Connect error.')
return self._url_available
def ele(self,

View File

@ -154,19 +154,30 @@ class MixPage(Null, SessionPage, DriverPage):
u = url or self.session_url
self._drission.cookies_to_driver(u)
def check_page(self) -> Union[bool, None]:
return
# if self.session_url == self.url:
# return True if self._response and self._response.ok else False
# ----------------重写SessionPage的函数-----------------------
def post(self, url: str, data: dict = None, go_anyway: bool = False, **kwargs) -> Union[bool, None]:
def post(self,
url: str,
data: dict = None,
go_anyway: bool = False,
show_errmsg: bool = False,
**kwargs) -> Union[bool, None]:
"""用post方式跳转到url \n
post前先转换模式但不跳转
:param url: 目标url
:param data: 提交的数据
:param go_anyway: 若目标url与当前url一致是否强制跳转
:param show_errmsg: 是否显示和抛出异常
:param kwargs: 连接参数
:return: url是否可用
"""
self.change_mode('s', go=False)
return super().post(url, data, go_anyway, **kwargs)
return super().post(url, data, go_anyway, show_errmsg, **kwargs)
def download(self,
file_url: str,
@ -174,6 +185,7 @@ class MixPage(Null, SessionPage, DriverPage):
rename: str = None,
file_exists: str = 'rename',
show_msg: bool = False,
show_errmsg: bool = False,
**kwargs) -> tuple:
"""下载一个文件 \n
d模式下下载前先同步cookies \n
@ -182,12 +194,13 @@ class MixPage(Null, SessionPage, DriverPage):
:param rename: 重命名文件可不写扩展名
:param file_exists: 若存在同名文件可选择 'rename', 'overwrite', 'skip' 方式处理
:param show_msg: 是否显示下载信息
:param show_errmsg: 是否显示和抛出异常
:param kwargs: 连接参数
:return: 下载是否成功bool和状态信息成功时信息为文件路径的元组
"""
if self.mode == 'd':
self.cookies_to_session()
return super().download(file_url, goal_path, rename, file_exists, show_msg, **kwargs)
return super().download(file_url, goal_path, rename, file_exists, show_msg, show_errmsg, **kwargs)
# ----------------重写DriverPage的函数-----------------------
@ -207,24 +220,19 @@ class MixPage(Null, SessionPage, DriverPage):
# ----------------以下为共用函数-----------------------
def get(self, url: str, go_anyway=False, **kwargs) -> Union[bool, None]:
def get(self, url: str, go_anyway=False, show_errmsg: bool = False, **kwargs) -> Union[bool, None]:
"""跳转到一个url \n
跳转前先同步cookies跳转后判断目标url是否可用
:param url: 目标url
:param go_anyway: 若目标url与当前url一致是否强制跳转
:param show_errmsg: 是否显示和抛出异常
:param kwargs: 连接参数s模式专用
:return: url是否可用
"""
if self._mode == 'd':
if super(SessionPage, self).get(url=url, go_anyway=go_anyway) is None:
return
if self.session_url == self.url:
self._url_available = True if self._response and self._response.ok else False
else:
self._url_available = self.check_page()
return self._url_available
return super(SessionPage, self).get(url, go_anyway, show_errmsg)
elif self._mode == 's':
return None if super().get(url=url, go_anyway=go_anyway, **kwargs) is None else self._url_available
return super().get(url, go_anyway, show_errmsg, **kwargs)
def ele(self,
loc_or_ele: Union[tuple, str, DriverElement, SessionElement, Element, WebElement],

View File

@ -138,10 +138,15 @@ class SessionPage(object):
raise TypeError('Type of loc_or_str can only be tuple or str.')
return self.ele(loc_or_str, mode='all', show_errmsg=True)
def get(self, url: str, go_anyway: bool = False, **kwargs) -> Union[bool, None]:
def get(self,
url: str,
go_anyway: bool = False,
show_errmsg: bool = False,
**kwargs) -> Union[bool, None]:
"""用get方式跳转到url \n
:param url: 目标url
:param go_anyway: 若目标url与当前url一致是否强制跳转
:param show_errmsg: 是否显示和抛出异常
:param kwargs: 连接参数
:return: url是否可用
"""
@ -149,17 +154,34 @@ class SessionPage(object):
if not url or (not go_anyway and self.url == to_url):
return
self._url = to_url
self._response = self._make_response(to_url, **kwargs)[0]
if self._response:
self._response.html.encoding = self._response.encoding # 修复requests_html丢失编码方式的bug
self._url_available = True if self._response and self._response.ok else False
self._response = self._make_response(to_url, show_errmsg=show_errmsg, **kwargs)[0]
if not self._response:
self._url_available = False
else:
try:
self._response.html.encoding = self._response.encoding # 修复requests_html丢失编码方式的bug
except:
pass
if self._response.ok:
self._url_available = True
else:
if show_errmsg:
raise ConnectionError(f'Status code: {self._response.status_code}.')
self._url_available = False
return self._url_available
def post(self, url: str, data: dict = None, go_anyway: bool = True, **kwargs) -> Union[bool, None]:
def post(self,
url: str,
data: dict = None,
go_anyway: bool = True,
show_errmsg: bool = False,
**kwargs) -> Union[bool, None]:
"""用post方式跳转到url \n
:param url: 目标url
:param data: 提交的数据
:param go_anyway: 若目标url与当前url一致是否强制跳转
:param show_errmsg: 是否显示和抛出异常
:param kwargs: 连接参数
:return: url是否可用
"""
@ -167,13 +189,21 @@ class SessionPage(object):
if not url or (not go_anyway and self._url == to_url):
return
self._url = to_url
self._response = self._make_response(to_url, mode='post', data=data, **kwargs)[0]
if self._response:
self._response = self._make_response(to_url, mode='post', data=data, show_errmsg=show_errmsg, **kwargs)[0]
if not self._response:
self._url_available = False
else:
try:
self._response.html.encoding = self._response.encoding # 修复requests_html丢失编码方式的bug
except:
pass
self._url_available = True if self._response and self._response.status_code == 200 else False
if self._response.ok:
self._url_available = True
else:
if show_errmsg:
raise ConnectionError(f'Status code: {self._response.status_code}.')
self._url_available = False
return self._url_available
def download(self,
@ -182,6 +212,7 @@ class SessionPage(object):
rename: str = None,
file_exists: str = 'rename',
show_msg: bool = False,
show_errmsg: bool = False,
**kwargs) -> tuple:
"""下载一个文件 \n
:param file_url: 文件url
@ -189,6 +220,7 @@ class SessionPage(object):
:param rename: 重命名文件可不写扩展名
:param file_exists: 若存在同名文件可选择 'rename', 'overwrite', 'skip' 方式处理
:param show_msg: 是否显示下载信息
:param show_errmsg: 是否抛出和显示异常
:param kwargs: 连接参数
:return: 下载是否成功bool和状态信息成功时信息为文件路径的元组
"""
@ -201,7 +233,7 @@ class SessionPage(object):
if 'timeout' not in kwargs:
kwargs['timeout'] = 20
r, info = self._make_response(file_url, mode='get', **kwargs)
r, info = self._make_response(file_url, mode='get', show_errmsg=show_errmsg, **kwargs)
if not r:
if show_msg:
print(info)
@ -280,11 +312,17 @@ class SessionPage(object):
info = f'{goal_path}\\{full_name}' if download_status else info
return download_status, info
def _make_response(self, url: str, mode: str = 'get', data: dict = None, **kwargs) -> tuple:
def _make_response(self,
url: str,
mode: str = 'get',
data: dict = None,
show_errmsg: bool = False,
**kwargs) -> tuple:
"""生成response对象 \n
:param url: 目标url
:param mode: 'get', 'post' 中选择
:param data: post方式要提交的数据
:param show_errmsg: 是否显示和抛出异常
:param kwargs: 其它参数
:return: Response对象
"""
@ -316,6 +354,8 @@ class SessionPage(object):
elif mode == 'post':
r = self.session.post(url, data=data, **kwargs)
except Exception as e:
if show_errmsg:
raise e
return None, e
else:
headers = dict(r.headers)