增加对shadow-dom支持,未完成

This commit is contained in:
g1879 2020-08-24 21:56:27 +08:00
parent 56683468a6
commit dc47dfcecc
2 changed files with 59 additions and 32 deletions

View File

@ -126,7 +126,11 @@ class DriverElement(DrissionElement):
@property
def shadow_root(self):
e = self.run_script('return arguments[0].shadowRoot')
return ShadowRootElement(e, self) if e else None
if e:
from shadow_root_element import ShadowRootElement
return ShadowRootElement(e, self)
else:
return None
@property
def parent(self):
@ -450,37 +454,6 @@ class DriverElement(DrissionElement):
ActionChains(self._driver).move_to_element(self.inner_ele).perform()
class ShadowRootElement(DrissionElement):
def __init__(self, inner_ele: WebElement, parent_ele: DriverElement):
super().__init__(inner_ele)
self.parent_ele = parent_ele
def ele(self, loc: Union[tuple, str], mode: str = None, show_errmsg: bool = True):
pass
def eles(self, loc: Union[tuple, str], show_errmsg: bool = True):
pass
def attr(self, attr: str):
return self.html if attr == 'innerHTML' else None
def run_script(self, script: str, *args) -> Any:
"""执行js代码传入自己为第一个参数 \n
:param script: js文本
:param args: 传入的参数
:return: js执行结果
"""
return self.inner_ele.parent.execute_script(script, self.inner_ele, *args)
@property
def html(self):
return unescape(self.attr('innerHTML')).replace('\xa0', ' ')
@property
def parent(self) -> DriverElement:
return self.parent_ele
def execute_driver_find(page_or_ele: Union[WebElement, WebDriver],
loc: tuple,
mode: str = 'single',

View File

@ -0,0 +1,54 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from html import unescape
from typing import Union, Any
from selenium.webdriver.remote.webelement import WebElement
from common import DrissionElement
# from driver_element import DriverElement
class ShadowRootElement(DrissionElement):
def __init__(self, inner_ele: WebElement, parent_ele):
super().__init__(inner_ele)
self.parent_ele = parent_ele
def ele(self, loc: Union[tuple, str], mode: str = None, show_errmsg: bool = True):
pass
def eles(self, loc: Union[tuple, str], show_errmsg: bool = True):
pass
def attr(self, attr: str):
return self.html if attr == 'innerHTML' else None
def run_script(self, script: str, *args) -> Any:
"""执行js代码传入自己为第一个参数 \n
:param script: js文本
:param args: 传入的参数
:return: js执行结果
"""
return self.inner_ele.parent.execute_script(script, self.inner_ele, *args)
@property
def html(self):
return unescape(self.attr('innerHTML')).replace('\xa0', ' ')
@property
def parent(self):
return self.parent_ele
def is_enabled(self) -> bool:
"""是否可用"""
return self.inner_ele.is_enabled()
def is_valid(self) -> bool:
"""用于判断元素是否还能用,应对页面跳转元素不能用的情况"""
try:
self.is_enabled()
return True
except:
return False