优先使用backend_id

This commit is contained in:
g1879 2023-02-21 11:48:47 +08:00
parent cb6fe6d68b
commit 5db489c4d9
3 changed files with 21 additions and 22 deletions

View File

@ -115,10 +115,10 @@ class ChromiumBase(BasePage):
while True:
try:
root_id = self.run_cdp('DOM.getDocument')['root']['nodeId']
b_id = self.run_cdp('DOM.getDocument')['root']['backendNodeId']
self._root_id = self.run_cdp('DOM.resolveNode', backendNodeId=b_id)['object']['objectId']
if self._debug_recorder:
self._debug_recorder.add_data((perf_counter(), '信息', f'root_id{root_id}'))
self._root_id = self.run_cdp('DOM.resolveNode', nodeId=root_id)['object']['objectId']
self._debug_recorder.add_data((perf_counter(), '信息', f'root_id{self._root_id}'))
break
except Exception:
@ -962,11 +962,11 @@ class ChromiumPageScroll(ChromiumScroll):
ele.run_js('this.scrollIntoView({behavior: "auto", block: "nearest", inline: "nearest"});')
x, y = ele.location
try:
ID = ele.page.run_cdp('DOM.getNodeForLocation', x=x, y=y).get('nodeId', None)
ID = ele.page.run_cdp('DOM.getNodeForLocation', x=x, y=y).get('backendNodeId', None)
except Exception:
pass
if ID != ele.ids.node_id:
if ID != ele.ids.backend_id:
ele.run_js('this.scrollIntoView({behavior: "auto", block: "center", inline: "center"});')

View File

@ -22,7 +22,7 @@ class ChromiumElement(DrissionElement):
"""ChromePage页面对象中的元素对象"""
def __init__(self, page, node_id=None, obj_id=None, backend_id=None):
"""初始化node_id和obj_id必须至少传入一个
"""初始化node_id、obj_id和backend_id必须至少传入一个
:param page: 元素所在ChromePage页面对象
:param node_id: cdp中的node id
:param obj_id: js中的object id
@ -76,13 +76,14 @@ class ChromiumElement(DrissionElement):
def tag(self):
"""返回元素tag"""
if self._tag is None:
self._tag = self.page.run_cdp('DOM.describeNode', nodeId=self._node_id)['node']['localName'].lower()
self._tag = self.page.run_cdp('DOM.describeNode',
backendNodeId=self._backend_id)['node']['localName'].lower()
return self._tag
@property
def html(self):
"""返回元素outerHTML文本"""
return self.page.run_cdp('DOM.getOuterHTML', nodeId=self._node_id)['outerHTML']
return self.page.run_cdp('DOM.getOuterHTML', backendNodeId=self._backend_id)['outerHTML']
@property
def inner_html(self):
@ -114,7 +115,7 @@ class ChromiumElement(DrissionElement):
@property
def size(self):
"""返回元素宽和高"""
model = self.page.run_cdp('DOM.getBoxModel', nodeId=self._node_id)['model']
model = self.page.run_cdp('DOM.getBoxModel', backendNodeId=self._backend_id)['model']
return model['height'], model['width']
@property
@ -153,7 +154,7 @@ class ChromiumElement(DrissionElement):
@property
def shadow_root(self):
"""返回当前元素的shadow_root元素对象"""
info = self.page.run_cdp('DOM.describeNode', nodeId=self.ids.node_id)['node']
info = self.page.run_cdp('DOM.describeNode', backendNodeId=self._backend_id)['node']
if not info.get('shadowRoots', None):
return None
@ -411,7 +412,7 @@ class ChromiumElement(DrissionElement):
while not self.run_js(js) and perf_counter() < end_time:
sleep(.1)
node = self.page.run_cdp('DOM.describeNode', nodeId=self._node_id)['node']
node = self.page.run_cdp('DOM.describeNode', backendNodeId=self._backend_id)['node']
frame = node.get('frameId', None)
frame = frame or self.page.tab_id
try:
@ -479,7 +480,7 @@ class ChromiumElement(DrissionElement):
return self._set_file_input(vals)
try:
self.page.run_cdp('DOM.focus', nodeId=self._node_id)
self.page.run_cdp('DOM.focus', backendNodeId=self._backend_id)
except Exception:
self.click(by_js=True)
@ -652,7 +653,7 @@ class ChromiumElement(DrissionElement):
if isinstance(files, str):
files = files.split('\n')
files = [str(Path(i).absolute()) for i in files]
self.page.run_cdp('DOM.setFileInputFiles', files=files, nodeId=self._node_id)
self.page.run_cdp('DOM.setFileInputFiles', files=files, backendNodeId=self._backend_id)
# ---------------准备废弃-----------------
def wait_ele(self, loc_or_ele, timeout=None):
@ -1043,8 +1044,7 @@ class ChromiumShadowRootElement(BaseElement):
else:
results = []
for i in css_paths:
node_id = self.page.run_cdp('DOM.querySelector',
nodeId=self._node_id, selector=i)['nodeId']
node_id = self.page.run_cdp('DOM.querySelector', nodeId=self._node_id, selector=i)['nodeId']
if node_id:
results.append(make_chromium_ele(self.page, node_id=node_id))
return results
@ -1484,7 +1484,7 @@ class ShadowRootElementStates(object):
def is_alive(self):
"""返回元素是否仍在DOM中"""
try:
self._ele.page.run_cdp('DOM.describeNode', nodeId=self._ele.ids.node_id)
self._ele.page.run_cdp('DOM.describeNode', backendNodeId=self._ele.ids.backend_id)
return True
except Exception:
return False
@ -1591,7 +1591,7 @@ class Locations(object):
:param quad: 方框类型margin border padding
:return: 四个角坐标大小为0时返回None
"""
return self._ele.page.run_cdp('DOM.getBoxModel', nodeId=self._ele.ids.node_id)['model'][quad]
return self._ele.page.run_cdp('DOM.getBoxModel', backendNodeId=self._ele.ids.backend_id)['model'][quad]
def _get_page_coord(self, x, y):
"""根据视口坐标获取绝对坐标"""

View File

@ -15,7 +15,7 @@ class ChromiumFrame(ChromiumBase):
def __init__(self, page, ele):
self.page = page
self.address = page.address
node = page.run_cdp('DOM.describeNode', nodeId=ele.ids.node_id)['node']
node = page.run_cdp('DOM.describeNode', backendNodeId=ele.ids.backend_id)['node']
self.frame_id = node['frameId']
self._backend_id = ele.ids.backend_id
self._frame_ele = ele
@ -69,7 +69,7 @@ class ChromiumFrame(ChromiumBase):
def _reload(self):
"""重新获取document"""
self._frame_ele = ChromiumElement(self.page, backend_id=self._backend_id)
node = self.page.run_cdp('DOM.describeNode', nodeId=self._frame_ele.ids.node_id)['node']
node = self.page.run_cdp('DOM.describeNode', backendNodeId=self._frame_ele.ids.backend_id)['node']
if self._is_inner_frame():
self._is_diff_domain = False
@ -88,7 +88,7 @@ class ChromiumFrame(ChromiumBase):
self._reload()
try:
self.page.run_cdp('DOM.describeNode', nodeId=self.ids.node_id)
self.page.run_cdp('DOM.describeNode', backendNodeId=self.ids.backend_id)
except Exception:
self._reload()
# sleep(2)
@ -164,8 +164,7 @@ class ChromiumFrame(ChromiumBase):
"""返回元素outerHTML文本"""
self._check_ok()
tag = self.tag
out_html = self.page.run_cdp('DOM.getOuterHTML',
nodeId=self.frame_ele.ids.node_id)['outerHTML']
out_html = self.page.run_cdp('DOM.getOuterHTML', backendNodeId=self.frame_ele.ids.backend_id)['outerHTML']
sign = search(rf'<{tag}.*?>', out_html).group(0)
return f'{sign}{self.inner_html}</{tag}>'