mirror of
https://gitee.com/g1879/DrissionPage.git
synced 2024-12-10 04:00:23 +08:00
ele()和eles()删除show_errmsg参数;
增加__call__()方法,ele('xxx')等效于ele.ele('xxx')
This commit is contained in:
parent
47ef460c2d
commit
1e8e606f93
@ -22,7 +22,7 @@ from .common import DrissionElement, get_loc_from_str, get_available_file_name,
|
|||||||
class DriverElement(DrissionElement):
|
class DriverElement(DrissionElement):
|
||||||
"""driver模式的元素对象,包装了一个WebElement对象,并封装了常用功能"""
|
"""driver模式的元素对象,包装了一个WebElement对象,并封装了常用功能"""
|
||||||
|
|
||||||
def __init__(self, ele: WebElement, page, timeout: float = 10):
|
def __init__(self, ele: WebElement, page=None, timeout: float = 10):
|
||||||
super().__init__(ele, page)
|
super().__init__(ele, page)
|
||||||
self.timeout = timeout
|
self.timeout = timeout
|
||||||
|
|
||||||
@ -30,6 +30,12 @@ class DriverElement(DrissionElement):
|
|||||||
attrs = [f"{attr}='{self.attrs[attr]}'" for attr in self.attrs]
|
attrs = [f"{attr}='{self.attrs[attr]}'" for attr in self.attrs]
|
||||||
return f'<DriverElement {self.tag} {" ".join(attrs)}>'
|
return f'<DriverElement {self.tag} {" ".join(attrs)}>'
|
||||||
|
|
||||||
|
def __call__(self,
|
||||||
|
loc_or_str: Union[Tuple[str, str], str],
|
||||||
|
mode: str = 'single',
|
||||||
|
timeout: float = None):
|
||||||
|
return self.ele(loc_or_str, mode, timeout or self.timeout)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def attrs(self) -> dict:
|
def attrs(self) -> dict:
|
||||||
"""返回元素所有属性及值"""
|
"""返回元素所有属性及值"""
|
||||||
@ -157,7 +163,7 @@ class DriverElement(DrissionElement):
|
|||||||
:return: DriverElement对象
|
:return: DriverElement对象
|
||||||
"""
|
"""
|
||||||
loc = 'xpath', f'.{"/.." * num}'
|
loc = 'xpath', f'.{"/.." * num}'
|
||||||
return self.ele(loc, timeout=0.01, show_errmsg=False)
|
return self.ele(loc, timeout=0.01)
|
||||||
|
|
||||||
def nexts(self, num: int = 1, mode: str = 'ele'):
|
def nexts(self, num: int = 1, mode: str = 'ele'):
|
||||||
"""返回后面第num个兄弟节点或元素 \n
|
"""返回后面第num个兄弟节点或元素 \n
|
||||||
@ -172,10 +178,10 @@ class DriverElement(DrissionElement):
|
|||||||
else:
|
else:
|
||||||
raise ValueError("Argument mode can only be 'node' or 'ele'.")
|
raise ValueError("Argument mode can only be 'node' or 'ele'.")
|
||||||
|
|
||||||
e = self.ele(f'xpath:./following-sibling::{node_txt}[{num}]', timeout=0.1, show_errmsg=False)
|
e = self.ele(f'xpath:./following-sibling::{node_txt}[{num}]', timeout=0.1)
|
||||||
while e == '\n':
|
while e == '\n':
|
||||||
num += 1
|
num += 1
|
||||||
e = self.ele(f'xpath:./following-sibling::{node_txt}[{num}]', timeout=0.1, show_errmsg=False)
|
e = self.ele(f'xpath:./following-sibling::{node_txt}[{num}]', timeout=0.1)
|
||||||
|
|
||||||
return e
|
return e
|
||||||
|
|
||||||
@ -192,10 +198,10 @@ class DriverElement(DrissionElement):
|
|||||||
else:
|
else:
|
||||||
raise ValueError("Argument mode can only be 'node' or 'ele'.")
|
raise ValueError("Argument mode can only be 'node' or 'ele'.")
|
||||||
|
|
||||||
e = self.ele(f'xpath:./preceding-sibling::{node_txt}[{num}]', timeout=0.1, show_errmsg=False)
|
e = self.ele(f'xpath:./preceding-sibling::{node_txt}[{num}]', timeout=0.1)
|
||||||
while e == '\n':
|
while e == '\n':
|
||||||
num += 1
|
num += 1
|
||||||
e = self.ele(f'xpath:./preceding-sibling::{node_txt}[{num}]', timeout=0.1, show_errmsg=False)
|
e = self.ele(f'xpath:./preceding-sibling::{node_txt}[{num}]', timeout=0.1)
|
||||||
|
|
||||||
return e
|
return e
|
||||||
|
|
||||||
@ -213,8 +219,7 @@ class DriverElement(DrissionElement):
|
|||||||
def ele(self,
|
def ele(self,
|
||||||
loc_or_str: Union[Tuple[str, str], str],
|
loc_or_str: Union[Tuple[str, str], str],
|
||||||
mode: str = None,
|
mode: str = None,
|
||||||
timeout: float = None,
|
timeout: float = None):
|
||||||
show_errmsg: bool = False):
|
|
||||||
"""返回当前元素下级符合条件的子元素,默认返回第一个 \n
|
"""返回当前元素下级符合条件的子元素,默认返回第一个 \n
|
||||||
示例: \n
|
示例: \n
|
||||||
- 用loc元组查找: \n
|
- 用loc元组查找: \n
|
||||||
@ -238,7 +243,6 @@ class DriverElement(DrissionElement):
|
|||||||
:param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串
|
:param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串
|
||||||
:param mode: 'single' 或 'all',对应查找一个或全部
|
:param mode: 'single' 或 'all',对应查找一个或全部
|
||||||
:param timeout: 查找元素超时时间
|
:param timeout: 查找元素超时时间
|
||||||
:param show_errmsg: 出现异常时是否打印信息
|
|
||||||
:return: DriverElement对象
|
:return: DriverElement对象
|
||||||
"""
|
"""
|
||||||
if isinstance(loc_or_str, (str, tuple)):
|
if isinstance(loc_or_str, (str, tuple)):
|
||||||
@ -266,12 +270,11 @@ class DriverElement(DrissionElement):
|
|||||||
loc_or_str = loc_or_str[0], f'{self.css_path}{loc_or_str[1]}'
|
loc_or_str = loc_or_str[0], f'{self.css_path}{loc_or_str[1]}'
|
||||||
|
|
||||||
timeout = timeout or self.timeout
|
timeout = timeout or self.timeout
|
||||||
return execute_driver_find(self, loc_or_str, mode, show_errmsg, timeout)
|
return execute_driver_find(self, loc_or_str, mode, timeout)
|
||||||
|
|
||||||
def eles(self,
|
def eles(self,
|
||||||
loc_or_str: Union[Tuple[str, str], str],
|
loc_or_str: Union[Tuple[str, str], str],
|
||||||
timeout: float = None,
|
timeout: float = None):
|
||||||
show_errmsg: bool = False):
|
|
||||||
"""返回当前元素下级所有符合条件的子元素 \n
|
"""返回当前元素下级所有符合条件的子元素 \n
|
||||||
示例: \n
|
示例: \n
|
||||||
- 用loc元组查找: \n
|
- 用loc元组查找: \n
|
||||||
@ -294,10 +297,9 @@ class DriverElement(DrissionElement):
|
|||||||
ele.eles('css:div.ele_class') - 返回所有符合css selector的子元素 \n
|
ele.eles('css:div.ele_class') - 返回所有符合css selector的子元素 \n
|
||||||
:param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串
|
:param loc_or_str: 元素的定位信息,可以是loc元组,或查询字符串
|
||||||
:param timeout: 查找元素超时时间
|
:param timeout: 查找元素超时时间
|
||||||
:param show_errmsg: 出现异常时是否打印信息
|
|
||||||
:return: DriverElement对象组成的列表
|
:return: DriverElement对象组成的列表
|
||||||
"""
|
"""
|
||||||
return self.ele(loc_or_str, mode='all', show_errmsg=show_errmsg, timeout=timeout)
|
return self.ele(loc_or_str, mode='all', timeout=timeout)
|
||||||
|
|
||||||
# -----------------以下为driver独占-------------------
|
# -----------------以下为driver独占-------------------
|
||||||
def click(self, by_js=None) -> bool:
|
def click(self, by_js=None) -> bool:
|
||||||
@ -411,7 +413,8 @@ class DriverElement(DrissionElement):
|
|||||||
try:
|
try:
|
||||||
ele.select_by_visible_text(text)
|
ele.select_by_visible_text(text)
|
||||||
return True
|
return True
|
||||||
except:
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def set_attr(self, attr: str, value: str) -> bool:
|
def set_attr(self, attr: str, value: str) -> bool:
|
||||||
@ -449,7 +452,7 @@ class DriverElement(DrissionElement):
|
|||||||
:param shake: 是否随机抖动
|
:param shake: 是否随机抖动
|
||||||
:return: 是否拖拽成功
|
:return: 是否拖拽成功
|
||||||
"""
|
"""
|
||||||
# x, y:目标坐标点
|
# x, y:目标点坐标
|
||||||
if isinstance(ele_or_loc, (DriverElement, WebElement)):
|
if isinstance(ele_or_loc, (DriverElement, WebElement)):
|
||||||
target_x = ele_or_loc.location['x'] + ele_or_loc.size['width'] // 2
|
target_x = ele_or_loc.location['x'] + ele_or_loc.size['width'] // 2
|
||||||
target_y = ele_or_loc.location['y'] + ele_or_loc.size['height'] // 2
|
target_y = ele_or_loc.location['y'] + ele_or_loc.size['height'] // 2
|
||||||
@ -491,20 +494,18 @@ class DriverElement(DrissionElement):
|
|||||||
def execute_driver_find(page_or_ele,
|
def execute_driver_find(page_or_ele,
|
||||||
loc: Tuple[str, str],
|
loc: Tuple[str, str],
|
||||||
mode: str = 'single',
|
mode: str = 'single',
|
||||||
show_errmsg: bool = False,
|
|
||||||
timeout: float = 10) -> Union[DriverElement, List[DriverElement or str]]:
|
timeout: float = 10) -> Union[DriverElement, List[DriverElement or str]]:
|
||||||
"""执行driver模式元素的查找 \n
|
"""执行driver模式元素的查找 \n
|
||||||
页面查找元素及元素查找下级元素皆使用此方法 \n
|
页面查找元素及元素查找下级元素皆使用此方法 \n
|
||||||
:param page_or_ele: DriverPage对象或DriverElement对象
|
:param page_or_ele: DriverPage对象或DriverElement对象
|
||||||
:param loc: 元素定位元组
|
:param loc: 元素定位元组
|
||||||
:param mode: 'single' 或 'all',对应获取第一个或全部
|
:param mode: 'single' 或 'all',对应获取第一个或全部
|
||||||
:param show_errmsg: 出现异常时是否显示错误信息
|
|
||||||
:param timeout: 查找元素超时时间
|
:param timeout: 查找元素超时时间
|
||||||
:return: 返回DriverElement元素或它们组成的列表
|
:return: 返回DriverElement元素或它们组成的列表
|
||||||
"""
|
"""
|
||||||
mode = mode or 'single'
|
mode = mode or 'single'
|
||||||
if mode not in ['single', 'all']:
|
if mode not in ['single', 'all']:
|
||||||
raise ValueError("Argument mode can only be 'single' or 'all'.")
|
raise ValueError(f"Argument mode can only be 'single' or 'all', not '{mode}'.")
|
||||||
|
|
||||||
if isinstance(page_or_ele, DriverElement):
|
if isinstance(page_or_ele, DriverElement):
|
||||||
page = page_or_ele.page
|
page = page_or_ele.page
|
||||||
@ -524,15 +525,12 @@ def execute_driver_find(page_or_ele,
|
|||||||
eles = wait.until(ec.presence_of_all_elements_located(loc))
|
eles = wait.until(ec.presence_of_all_elements_located(loc))
|
||||||
return [DriverElement(ele, page, timeout) for ele in eles]
|
return [DriverElement(ele, page, timeout) for ele in eles]
|
||||||
|
|
||||||
except InvalidElementStateException:
|
|
||||||
raise ValueError('Query statement error.', loc)
|
|
||||||
|
|
||||||
except TimeoutException:
|
except TimeoutException:
|
||||||
if show_errmsg:
|
|
||||||
print('Element(s) not found.', loc)
|
|
||||||
raise
|
|
||||||
return [] if mode == 'all' else None
|
return [] if mode == 'all' else None
|
||||||
|
|
||||||
|
except InvalidElementStateException:
|
||||||
|
raise ValueError('Invalid query syntax.', loc)
|
||||||
|
|
||||||
|
|
||||||
class ElementsByXpath(object):
|
class ElementsByXpath(object):
|
||||||
"""用js通过xpath获取元素、节点或属性,与WebDriverWait配合使用"""
|
"""用js通过xpath获取元素、节点或属性,与WebDriverWait配合使用"""
|
||||||
@ -559,7 +557,7 @@ class ElementsByXpath(object):
|
|||||||
:param node: 'document' 或 元素对象
|
:param node: 'document' 或 元素对象
|
||||||
:param xpath_txt: xpath语句
|
:param xpath_txt: xpath语句
|
||||||
:param type_txt: resultType,参考https://developer.mozilla.org/zh-CN/docs/Web/API/Document/evaluate
|
:param type_txt: resultType,参考https://developer.mozilla.org/zh-CN/docs/Web/API/Document/evaluate
|
||||||
:return:
|
:return: 元素对象或属性、文本字符串
|
||||||
"""
|
"""
|
||||||
node_txt = 'document' if not node or node == 'document' else 'arguments[0]'
|
node_txt = 'document' if not node or node == 'document' else 'arguments[0]'
|
||||||
for_txt = ''
|
for_txt = ''
|
||||||
@ -583,12 +581,14 @@ class ElementsByXpath(object):
|
|||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
return_txt = 'return a;'
|
return_txt = 'return a;'
|
||||||
|
|
||||||
elif type_txt == '2':
|
elif type_txt == '2':
|
||||||
return_txt = 'return e.stringValue;'
|
return_txt = 'return e.stringValue;'
|
||||||
elif type_txt == '1':
|
elif type_txt == '1':
|
||||||
return_txt = 'return e.numberValue;'
|
return_txt = 'return e.numberValue;'
|
||||||
else:
|
else:
|
||||||
return_txt = 'return e.singleNodeValue;'
|
return_txt = 'return e.singleNodeValue;'
|
||||||
|
|
||||||
js = """
|
js = """
|
||||||
var e=document.evaluate('""" + xpath_txt + """', """ + node_txt + """, null, """ + type_txt + """, null);
|
var e=document.evaluate('""" + xpath_txt + """', """ + node_txt + """, null, """ + type_txt + """, null);
|
||||||
""" + for_txt + """
|
""" + for_txt + """
|
||||||
|
Loading…
x
Reference in New Issue
Block a user