mirror of
https://gitee.com/g1879/DrissionPage.git
synced 2024-12-10 04:00:23 +08:00
功能完成
This commit is contained in:
parent
939a6a3144
commit
c4f52a312a
@ -1086,7 +1086,6 @@ class ChromiumBase(BasePage):
|
|||||||
:param tab_id: 要控制的标签页id,不指定默认为激活的
|
:param tab_id: 要控制的标签页id,不指定默认为激活的
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
self._is_loading = False
|
|
||||||
self._root_id = None
|
self._root_id = None
|
||||||
self.timeouts = Timeout(self)
|
self.timeouts = Timeout(self)
|
||||||
self._control_session = Session()
|
self._control_session = Session()
|
||||||
@ -1100,7 +1099,6 @@ class ChromiumBase(BasePage):
|
|||||||
self._set_options()
|
self._set_options()
|
||||||
self._init_page(tab_id)
|
self._init_page(tab_id)
|
||||||
self._get_document()
|
self._get_document()
|
||||||
self._first_run = False
|
|
||||||
|
|
||||||
def _init_page(self, tab_id: str = None) -> None:
|
def _init_page(self, tab_id: str = None) -> None:
|
||||||
"""新建页面、页面刷新、切换标签页后要进行的cdp参数初始化
|
"""新建页面、页面刷新、切换标签页后要进行的cdp参数初始化
|
||||||
@ -1109,23 +1107,23 @@ class ChromiumBase(BasePage):
|
|||||||
"""
|
"""
|
||||||
self._is_loading = True
|
self._is_loading = True
|
||||||
if tab_id:
|
if tab_id:
|
||||||
self._driver = Tab(id=tab_id, type='page',
|
self._tab_obj = Tab(id=tab_id, type='page',
|
||||||
webSocketDebuggerUrl=f'ws://{self.address}/devtools/page/{tab_id}')
|
webSocketDebuggerUrl=f'ws://{self.address}/devtools/page/{tab_id}')
|
||||||
|
|
||||||
self._driver.start()
|
self._tab_obj.start()
|
||||||
self._driver.DOM.enable()
|
self._tab_obj.DOM.enable()
|
||||||
self._driver.Page.enable()
|
self._tab_obj.Page.enable()
|
||||||
|
|
||||||
self._driver.Page.frameNavigated = self._onFrameNavigated
|
self._tab_obj.Page.frameNavigated = self._onFrameNavigated
|
||||||
self._driver.Page.loadEventFired = self._onLoadEventFired
|
self._tab_obj.Page.loadEventFired = self._onLoadEventFired
|
||||||
# self._driver.DOM.documentUpdated = self._onDocumentUpdated
|
# self._tab_obj.DOM.documentUpdated = self._onDocumentUpdated
|
||||||
|
|
||||||
def _get_document(self) -> None:
|
def _get_document(self) -> None:
|
||||||
"""刷新cdp使用的document数据"""
|
"""刷新cdp使用的document数据"""
|
||||||
# print('get doc')
|
# print('get doc')
|
||||||
self._wait_loading()
|
self._wait_loading()
|
||||||
root_id = self._driver.DOM.getDocument()['root']['nodeId']
|
root_id = self._tab_obj.DOM.getDocument()['root']['nodeId']
|
||||||
self._root_id = self._driver.DOM.resolveNode(nodeId=root_id)['object']['objectId']
|
self._root_id = self._tab_obj.DOM.resolveNode(nodeId=root_id)['object']['objectId']
|
||||||
self._is_loading = False
|
self._is_loading = False
|
||||||
|
|
||||||
def _wait_loading(self, timeout: float = None) -> bool:
|
def _wait_loading(self, timeout: float = None) -> bool:
|
||||||
@ -1146,7 +1144,9 @@ class ChromiumBase(BasePage):
|
|||||||
elif self.page_load_strategy == 'none':
|
elif self.page_load_strategy == 'none':
|
||||||
self.stop_loading()
|
self.stop_loading()
|
||||||
return True
|
return True
|
||||||
|
sleep(.1)
|
||||||
|
|
||||||
|
self.stop_loading()
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def _onLoadEventFired(self, **kwargs):
|
def _onLoadEventFired(self, **kwargs):
|
||||||
@ -1161,9 +1161,9 @@ class ChromiumBase(BasePage):
|
|||||||
# print('nav')
|
# print('nav')
|
||||||
self._is_loading = True
|
self._is_loading = True
|
||||||
|
|
||||||
def _onDocumentUpdated(self, **kwargs):
|
# def _onDocumentUpdated(self, **kwargs):
|
||||||
# print('doc')
|
# # print('doc')
|
||||||
pass
|
# pass
|
||||||
|
|
||||||
def _set_options(self) -> None:
|
def _set_options(self) -> None:
|
||||||
pass
|
pass
|
||||||
@ -1181,22 +1181,25 @@ class ChromiumBase(BasePage):
|
|||||||
@property
|
@property
|
||||||
def driver(self) -> Tab:
|
def driver(self) -> Tab:
|
||||||
"""返回用于控制浏览器的Tab对象"""
|
"""返回用于控制浏览器的Tab对象"""
|
||||||
return self._driver
|
return self._tab_obj
|
||||||
|
|
||||||
|
@property
|
||||||
|
def _driver(self):
|
||||||
|
return self._tab_obj
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def _wait_driver(self) -> Tab:
|
def _wait_driver(self) -> Tab:
|
||||||
"""返回用于控制浏览器的Tab对象,会先等待页面加载完毕"""
|
"""返回用于控制浏览器的Tab对象,会先等待页面加载完毕"""
|
||||||
while self._is_loading:
|
while self._is_loading:
|
||||||
# print('loading')
|
|
||||||
sleep(.1)
|
sleep(.1)
|
||||||
return self._driver
|
self._wait_loading()
|
||||||
|
return self._tab_obj
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def url(self) -> str:
|
def url(self) -> str:
|
||||||
"""返回当前页面url"""
|
"""返回当前页面url"""
|
||||||
tab_id = self._wait_driver.id # 用于WebPage时激活浏览器
|
|
||||||
json = loads(self._control_session.get(f'http://{self.address}/json').text)
|
json = loads(self._control_session.get(f'http://{self.address}/json').text)
|
||||||
return [i['url'] for i in json if i['id'] == tab_id][0]
|
return [i['url'] for i in json if i['id'] == self._tab_obj.id][0] # change_mode要调用,不能用_driver
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def html(self) -> str:
|
def html(self) -> str:
|
||||||
|
@ -55,7 +55,6 @@ class ChromiumPage(ChromiumBase):
|
|||||||
tab_id = [i['id'] for i in json if i['type'] == 'page'][0]
|
tab_id = [i['id'] for i in json if i['type'] == 'page'][0]
|
||||||
self._init_page(tab_id)
|
self._init_page(tab_id)
|
||||||
self._get_document()
|
self._get_document()
|
||||||
self._first_run = False
|
|
||||||
|
|
||||||
# 接收浏览器地址和端口
|
# 接收浏览器地址和端口
|
||||||
elif isinstance(addr_tab_opts, str):
|
elif isinstance(addr_tab_opts, str):
|
||||||
@ -69,22 +68,21 @@ class ChromiumPage(ChromiumBase):
|
|||||||
tab_id = [i['id'] for i in json if i['type'] == 'page'][0]
|
tab_id = [i['id'] for i in json if i['type'] == 'page'][0]
|
||||||
self._init_page(tab_id)
|
self._init_page(tab_id)
|
||||||
self._get_document()
|
self._get_document()
|
||||||
self._first_run = False
|
|
||||||
|
|
||||||
# 接收传递过来的Tab,浏览器
|
# 接收传递过来的Tab,浏览器
|
||||||
elif isinstance(addr_tab_opts, Tab):
|
elif isinstance(addr_tab_opts, Tab):
|
||||||
self._driver = addr_tab_opts
|
self._tab_obj = addr_tab_opts
|
||||||
self.address = search(r'ws://(.*?)/dev', addr_tab_opts._websocket_url).group(1)
|
self.address = search(r'ws://(.*?)/dev', addr_tab_opts._websocket_url).group(1)
|
||||||
self.process = None
|
self.process = None
|
||||||
self.options = DriverOptions(read_file=False)
|
self.options = DriverOptions(read_file=False)
|
||||||
self._set_options()
|
self._set_options()
|
||||||
self._init_page(tab_id)
|
self._init_page(tab_id)
|
||||||
self._get_document()
|
self._get_document()
|
||||||
self._first_run = False
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise TypeError('只能接收Tab或DriverOptions类型参数。')
|
raise TypeError('只能接收Tab或DriverOptions类型参数。')
|
||||||
|
|
||||||
|
self._first_run = False
|
||||||
self._main_tab = self.tab_id
|
self._main_tab = self.tab_id
|
||||||
|
|
||||||
def _init_page(self, tab_id: str = None) -> None:
|
def _init_page(self, tab_id: str = None) -> None:
|
||||||
@ -94,8 +92,8 @@ class ChromiumPage(ChromiumBase):
|
|||||||
"""
|
"""
|
||||||
super()._init_page(tab_id)
|
super()._init_page(tab_id)
|
||||||
|
|
||||||
self._driver.Page.javascriptDialogOpening = self._on_alert_open
|
self._tab_obj.Page.javascriptDialogOpening = self._on_alert_open
|
||||||
self._driver.Page.javascriptDialogClosed = self._on_alert_close
|
self._tab_obj.Page.javascriptDialogClosed = self._on_alert_close
|
||||||
|
|
||||||
def _set_options(self) -> None:
|
def _set_options(self) -> None:
|
||||||
self.set_timeouts(page_load=self.options.timeouts['pageLoad'] / 1000,
|
self.set_timeouts(page_load=self.options.timeouts['pageLoad'] / 1000,
|
||||||
@ -111,7 +109,7 @@ class ChromiumPage(ChromiumBase):
|
|||||||
@property
|
@property
|
||||||
def tabs(self) -> list:
|
def tabs(self) -> list:
|
||||||
"""返回所有标签页id"""
|
"""返回所有标签页id"""
|
||||||
d = self._wait_driver
|
self._driver
|
||||||
json = loads(self._control_session.get(f'http://{self.address}/json').text)
|
json = loads(self._control_session.get(f'http://{self.address}/json').text)
|
||||||
return [i['id'] for i in json if i['type'] == 'page']
|
return [i['id'] for i in json if i['type'] == 'page']
|
||||||
|
|
||||||
@ -119,7 +117,7 @@ class ChromiumPage(ChromiumBase):
|
|||||||
def process_id(self) -> Union[None, int]:
|
def process_id(self) -> Union[None, int]:
|
||||||
"""返回浏览器进程id"""
|
"""返回浏览器进程id"""
|
||||||
try:
|
try:
|
||||||
return self._wait_driver.SystemInfo.getProcessInfo()['id']
|
return self._driver.SystemInfo.getProcessInfo()['id']
|
||||||
except Exception:
|
except Exception:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@ -300,8 +298,8 @@ class ChromiumPage(ChromiumBase):
|
|||||||
|
|
||||||
def quit(self) -> None:
|
def quit(self) -> None:
|
||||||
"""关闭浏览器"""
|
"""关闭浏览器"""
|
||||||
self._driver.Browser.close()
|
self._tab_obj.Browser.close()
|
||||||
self._driver.stop()
|
self._tab_obj.stop()
|
||||||
|
|
||||||
def _on_alert_close(self, **kwargs):
|
def _on_alert_close(self, **kwargs):
|
||||||
"""alert关闭时触发的方法"""
|
"""alert关闭时触发的方法"""
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
# -*- coding:utf-8 -*-
|
# -*- coding:utf-8 -*-
|
||||||
|
from time import sleep
|
||||||
from typing import Union, Tuple, List
|
from typing import Union, Tuple, List
|
||||||
|
|
||||||
from DownloadKit import DownloadKit
|
from DownloadKit import DownloadKit
|
||||||
@ -65,7 +66,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage):
|
|||||||
def url(self) -> Union[str, None]:
|
def url(self) -> Union[str, None]:
|
||||||
"""返回当前url"""
|
"""返回当前url"""
|
||||||
if self._mode == 'd':
|
if self._mode == 'd':
|
||||||
return super(SessionPage, self).url if self._has_driver else None
|
return super(SessionPage, self).url if self._tab_obj else None
|
||||||
elif self._mode == 's':
|
elif self._mode == 's':
|
||||||
return self._session_url
|
return self._session_url
|
||||||
|
|
||||||
@ -114,6 +115,19 @@ class WebPage(SessionPage, ChromiumPage, BasePage):
|
|||||||
|
|
||||||
return self._session
|
return self._session
|
||||||
|
|
||||||
|
@property
|
||||||
|
def driver(self) -> Tab:
|
||||||
|
"""返回纯粹的Tab对象"""
|
||||||
|
return self._tab_obj
|
||||||
|
|
||||||
|
@property
|
||||||
|
def _wait_driver(self) -> Tab:
|
||||||
|
"""返回用于控制浏览器的Tab对象,会先等待页面加载完毕"""
|
||||||
|
while self._is_loading:
|
||||||
|
sleep(.1)
|
||||||
|
# self._wait_loading()
|
||||||
|
return self._driver
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def _driver(self) -> Tab:
|
def _driver(self) -> Tab:
|
||||||
"""返回纯粹的Tab对象,调用时切换到d模式,并连接浏览器"""
|
"""返回纯粹的Tab对象,调用时切换到d模式,并连接浏览器"""
|
||||||
@ -214,8 +228,9 @@ class WebPage(SessionPage, ChromiumPage, BasePage):
|
|||||||
|
|
||||||
# s模式转d模式
|
# s模式转d模式
|
||||||
if self._mode == 'd':
|
if self._mode == 'd':
|
||||||
if not self._has_driver:
|
if self._tab_obj is None:
|
||||||
d = self.driver
|
self._connect_browser(self._driver_options, self._setting_tab_id)
|
||||||
|
|
||||||
self._url = None if not self._has_driver else super(SessionPage, self).url
|
self._url = None if not self._has_driver else super(SessionPage, self).url
|
||||||
self._has_driver = True
|
self._has_driver = True
|
||||||
|
|
||||||
@ -274,7 +289,8 @@ class WebPage(SessionPage, ChromiumPage, BasePage):
|
|||||||
return self._get_driver_cookies(as_dict)
|
return self._get_driver_cookies(as_dict)
|
||||||
|
|
||||||
def _get_driver_cookies(self, as_dict: bool = False):
|
def _get_driver_cookies(self, as_dict: bool = False):
|
||||||
cookies = super(SessionPage, self)._wait_driver.Network.getCookies()['cookies']
|
cookies = self._tab_obj.Network.getCookies()['cookies']
|
||||||
|
# cookies = super(WebPage, self)._wait_driver.Network.getCookies()['cookies']
|
||||||
if as_dict:
|
if as_dict:
|
||||||
return {cookie['name']: cookie['value'] for cookie in cookies}
|
return {cookie['name']: cookie['value'] for cookie in cookies}
|
||||||
else:
|
else:
|
||||||
@ -292,7 +308,8 @@ class WebPage(SessionPage, ChromiumPage, BasePage):
|
|||||||
'name': cookie['name'],
|
'name': cookie['name'],
|
||||||
'domain': cookie['domain']}
|
'domain': cookie['domain']}
|
||||||
result_cookies.append(c)
|
result_cookies.append(c)
|
||||||
super(SessionPage, self)._wait_driver.Network.setCookies(cookies=result_cookies)
|
# super(WebPage, self)._wait_driver.Network.setCookies(cookies=result_cookies)
|
||||||
|
self._tab_obj.Network.setCookies(cookies=result_cookies)
|
||||||
|
|
||||||
# 添加cookie到session
|
# 添加cookie到session
|
||||||
if set_session:
|
if set_session:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user