mirror of
https://gitee.com/g1879/DrissionPage.git
synced 2024-12-10 04:00:23 +08:00
修复Page对象设置下载路径问题;
优化等待新tab逻辑; 接管来自selenium和playwright的浏览器时忽略无头设置; 优化关闭tab逻辑
This commit is contained in:
parent
6961fa07ff
commit
65d561e079
@ -64,6 +64,8 @@ class Chromium(object):
|
|||||||
self._frames = {}
|
self._frames = {}
|
||||||
self._drivers = {}
|
self._drivers = {}
|
||||||
self._all_drivers = {}
|
self._all_drivers = {}
|
||||||
|
self._newest_tab_id = None
|
||||||
|
self._tab_to_close = set()
|
||||||
|
|
||||||
self._set = None
|
self._set = None
|
||||||
self._wait = None
|
self._wait = None
|
||||||
@ -211,12 +213,14 @@ class Chromium(object):
|
|||||||
return
|
return
|
||||||
|
|
||||||
for tab in tabs:
|
for tab in tabs:
|
||||||
self._onTargetDestroyed(targetId=tab)
|
self._close_tab(tab_id=tab)
|
||||||
self._driver.run('Target.closeTarget', targetId=tab)
|
|
||||||
|
def _close_tab(self, tab_id):
|
||||||
|
# self._onTargetDestroyed(targetId=tab)
|
||||||
|
self._tab_to_close.add(tab_id)
|
||||||
|
self._driver.run('Target.closeTarget', targetId=tab_id)
|
||||||
|
while tab_id in self._tab_to_close:
|
||||||
sleep(.2)
|
sleep(.2)
|
||||||
end_time = perf_counter() + 3
|
|
||||||
while self.tabs_count != end_len and perf_counter() < end_time:
|
|
||||||
sleep(.1)
|
|
||||||
|
|
||||||
def activate_tab(self, id_ind_tab):
|
def activate_tab(self, id_ind_tab):
|
||||||
if isinstance(id_ind_tab, int):
|
if isinstance(id_ind_tab, int):
|
||||||
@ -392,6 +396,7 @@ class Chromium(object):
|
|||||||
d = Driver(tab_id, 'page', self.address)
|
d = Driver(tab_id, 'page', self.address)
|
||||||
self._drivers[tab_id] = d
|
self._drivers[tab_id] = d
|
||||||
self._all_drivers.setdefault(tab_id, set()).add(d)
|
self._all_drivers.setdefault(tab_id, set()).add(d)
|
||||||
|
self._newest_tab_id = tab_id
|
||||||
except WebSocketBadStatusException:
|
except WebSocketBadStatusException:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -404,6 +409,7 @@ class Chromium(object):
|
|||||||
d.stop()
|
d.stop()
|
||||||
self._drivers.pop(tab_id, None)
|
self._drivers.pop(tab_id, None)
|
||||||
self._all_drivers.pop(tab_id, None)
|
self._all_drivers.pop(tab_id, None)
|
||||||
|
self._tab_to_close.discard(tab_id)
|
||||||
|
|
||||||
def _on_disconnect(self):
|
def _on_disconnect(self):
|
||||||
if not self._disconnect_flag:
|
if not self._disconnect_flag:
|
||||||
|
@ -51,6 +51,8 @@ class Chromium(object):
|
|||||||
_disconnect_flag: bool = ...
|
_disconnect_flag: bool = ...
|
||||||
_none_ele_return_value: bool = ...
|
_none_ele_return_value: bool = ...
|
||||||
_none_ele_value: Any = ...
|
_none_ele_value: Any = ...
|
||||||
|
_newest_tab_id: Optional[str] = ...
|
||||||
|
_tab_to_close: set = ...
|
||||||
|
|
||||||
def __new__(cls,
|
def __new__(cls,
|
||||||
addr_or_opts: Union[str, int, ChromiumOptions] = None,
|
addr_or_opts: Union[str, int, ChromiumOptions] = None,
|
||||||
@ -192,6 +194,12 @@ class Chromium(object):
|
|||||||
"""
|
"""
|
||||||
...
|
...
|
||||||
|
|
||||||
|
def _close_tab(self, tab_id: str):
|
||||||
|
"""关闭一个标签页
|
||||||
|
:param tab_id: 标签页id
|
||||||
|
:return: None
|
||||||
|
"""
|
||||||
|
|
||||||
def activate_tab(self, id_ind_tab: Union[int, str, ChromiumTab]) -> None:
|
def activate_tab(self, id_ind_tab: Union[int, str, ChromiumTab]) -> None:
|
||||||
"""使一个标签页显示到前端
|
"""使一个标签页显示到前端
|
||||||
:param id_ind_tab: 标签页id(str)、Tab对象或标签页序号(int),序号从1开始
|
:param id_ind_tab: 标签页id(str)、Tab对象或标签页序号(int),序号从1开始
|
||||||
|
@ -114,7 +114,7 @@ class ChromiumPage(ChromiumBase):
|
|||||||
self.browser.activate_tab(id_ind_tab)
|
self.browser.activate_tab(id_ind_tab)
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
self.close_tabs(self.tab_id)
|
self.browser._close_tab(self.tab_id)
|
||||||
|
|
||||||
def close_tabs(self, tabs_or_ids=None, others=False):
|
def close_tabs(self, tabs_or_ids=None, others=False):
|
||||||
self.browser.close_tabs(tabs_or_ids=tabs_or_ids or self.tab_id, others=others)
|
self.browser.close_tabs(tabs_or_ids=tabs_or_ids or self.tab_id, others=others)
|
||||||
|
@ -51,7 +51,10 @@ class ChromiumTab(ChromiumBase):
|
|||||||
self._none_ele_value = self.browser._none_ele_value
|
self._none_ele_value = self.browser._none_ele_value
|
||||||
|
|
||||||
def close(self, others=False):
|
def close(self, others=False):
|
||||||
self.browser.close_tabs(self.tab_id, others=others)
|
if others:
|
||||||
|
self.browser.close_tabs(self.tab_id, others=True)
|
||||||
|
else:
|
||||||
|
self.browser._close_tab(self.tab_id)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def set(self):
|
def set(self):
|
||||||
|
@ -228,7 +228,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage):
|
|||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
if self._has_driver:
|
if self._has_driver:
|
||||||
self.close_tabs(self.tab_id)
|
self.browser._close_tab(self.tab_id)
|
||||||
if self._session:
|
if self._session:
|
||||||
self._session.close()
|
self._session.close()
|
||||||
if self._response is not None:
|
if self._response is not None:
|
||||||
|
@ -144,7 +144,7 @@ class Clicker(object):
|
|||||||
self._ele.owner.wait.upload_paths_inputted()
|
self._ele.owner.wait.upload_paths_inputted()
|
||||||
|
|
||||||
def for_new_tab(self, by_js=False, timeout=3):
|
def for_new_tab(self, by_js=False, timeout=3):
|
||||||
curr_tid = self._ele.tab.browser.tab_ids[0]
|
curr_tid = self._ele.tab.browser._newest_tab_id
|
||||||
self.left(by_js=by_js)
|
self.left(by_js=by_js)
|
||||||
tid = self._ele.tab.browser.wait.new_tab(timeout=timeout, curr_tab=curr_tid)
|
tid = self._ele.tab.browser.wait.new_tab(timeout=timeout, curr_tab=curr_tid)
|
||||||
if not tid:
|
if not tid:
|
||||||
|
@ -264,7 +264,7 @@ class ChromiumPageSetter(TabSetter):
|
|||||||
|
|
||||||
def download_path(self, path):
|
def download_path(self, path):
|
||||||
super().download_path(path)
|
super().download_path(path)
|
||||||
self._owner.browser._download_path = self._owner._download_path
|
self._owner.browser.set.download_path(path)
|
||||||
|
|
||||||
|
|
||||||
class WebPageSetter(ChromiumPageSetter):
|
class WebPageSetter(ChromiumPageSetter):
|
||||||
|
@ -28,16 +28,15 @@ class OriginWaiter(object):
|
|||||||
class BrowserWaiter(OriginWaiter):
|
class BrowserWaiter(OriginWaiter):
|
||||||
def new_tab(self, timeout=None, curr_tab=None, raise_err=None):
|
def new_tab(self, timeout=None, curr_tab=None, raise_err=None):
|
||||||
if not curr_tab:
|
if not curr_tab:
|
||||||
curr_tab = self._owner.tab_ids[0]
|
curr_tab = self._owner._newest_tab_id
|
||||||
elif hasattr(curr_tab, '_type'):
|
elif hasattr(curr_tab, '_type'):
|
||||||
curr_tab = curr_tab.tab_id
|
curr_tab = curr_tab.tab_id
|
||||||
if timeout is None:
|
if timeout is None:
|
||||||
timeout = self._owner.timeout
|
timeout = self._owner.timeout
|
||||||
end_time = perf_counter() + timeout
|
end_time = perf_counter() + timeout
|
||||||
while perf_counter() < end_time:
|
while perf_counter() < end_time:
|
||||||
latest_tid = self._owner.tab_ids[0]
|
if curr_tab != self._owner._newest_tab_id:
|
||||||
if curr_tab != latest_tid:
|
return self._owner._newest_tab_id
|
||||||
return latest_tid
|
|
||||||
sleep(.01)
|
sleep(.01)
|
||||||
|
|
||||||
if raise_err is True or Settings.raise_when_wait_failed is True:
|
if raise_err is True or Settings.raise_when_wait_failed is True:
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
@License : BSD 3-Clause.
|
@License : BSD 3-Clause.
|
||||||
"""
|
"""
|
||||||
from ._base.chromium import Chromium
|
from ._base.chromium import Chromium
|
||||||
|
from ._configs.chromium_options import ChromiumOptions
|
||||||
from ._elements.session_element import make_session_ele
|
from ._elements.session_element import make_session_ele
|
||||||
from ._functions.by import By
|
from ._functions.by import By
|
||||||
from ._functions.keys import Keys
|
from ._functions.keys import Keys
|
||||||
@ -23,7 +24,9 @@ def from_selenium(driver):
|
|||||||
address, port = driver.caps.get('goog:chromeOptions', {}).get('debuggerAddress', ':').split(':')
|
address, port = driver.caps.get('goog:chromeOptions', {}).get('debuggerAddress', ':').split(':')
|
||||||
if not address:
|
if not address:
|
||||||
raise RuntimeError('获取失败。')
|
raise RuntimeError('获取失败。')
|
||||||
return Chromium(f'{address}:{port}')
|
co = ChromiumOptions().set_local_port(f'{address}:{port}')
|
||||||
|
co._ua_set = True
|
||||||
|
return Chromium(co)
|
||||||
|
|
||||||
|
|
||||||
def from_playwright(page_or_browser):
|
def from_playwright(page_or_browser):
|
||||||
@ -48,4 +51,6 @@ def from_playwright(page_or_browser):
|
|||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
raise RuntimeError('获取失败,请用管理员权限运行。')
|
raise RuntimeError('获取失败,请用管理员权限运行。')
|
||||||
return Chromium(f'127.0.0.1:{port}')
|
co = ChromiumOptions().set_local_port(f'127.0.0.1:{port}')
|
||||||
|
co._ua_set = True
|
||||||
|
return Chromium(co)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user