diff --git a/DrissionPage/common.py b/DrissionPage/common.py index 4518d13..e73c0f2 100644 --- a/DrissionPage/common.py +++ b/DrissionPage/common.py @@ -52,12 +52,29 @@ class DrissionElement(object): def prev(self): return + @property + def xpath(self): + def get_xpath(ele: DrissionElement, xpath_str=''): + ele_id = ele.attr('id') + if ele_id: + return None, f'//*[@id="{ele_id}"]{xpath_str}' + else: + brothers = len(ele.eles(f'xpath:./preceding-sibling::{ele.tag}', timeout=0.001)) # FIXME: 修改这里 + xpath_str = f'/{ele.tag}[{brothers + 1}]{xpath_str}' if brothers > 0 else f'/{ele.tag}{xpath_str}' + ele = ele.parent + print(xpath_str) + while ele: + ele, xpath_str = get_xpath(ele, xpath_str) + return ele, xpath_str + + return get_xpath(self)[1] + @abstractmethod - def ele(self, loc: tuple, mode: str = None, show_errmsg: bool = True): + def ele(self, loc: Union[tuple, str], mode: str = None, show_errmsg: bool = True): pass @abstractmethod - def eles(self, loc: tuple, show_errmsg: bool = True): + def eles(self, loc: Union[tuple, str], show_errmsg: bool = True): pass @abstractmethod diff --git a/DrissionPage/driver_element.py b/DrissionPage/driver_element.py index b39fcdc..1a6cc70 100644 --- a/DrissionPage/driver_element.py +++ b/DrissionPage/driver_element.py @@ -92,7 +92,7 @@ class DriverElement(DrissionElement): :return: DriverElement对象 """ loc = 'xpath', f'.{"/.." * num}' - return self.ele(loc, timeout=1, show_errmsg=False) + return self.ele(loc, timeout=0.01, show_errmsg=False) def nexts(self, num: int = 1): """返回后面第num个兄弟元素 \n @@ -100,7 +100,7 @@ class DriverElement(DrissionElement): :return: DriverElement对象 """ loc = 'xpath', f'./following-sibling::*[{num}]' - return self.ele(loc, timeout=1, show_errmsg=False) + return self.ele(loc, timeout=0.1, show_errmsg=False) def prevs(self, num: int = 1): """返回前面第num个兄弟元素 \n @@ -108,7 +108,7 @@ class DriverElement(DrissionElement): :return: DriverElement对象 """ loc = 'xpath', f'./preceding-sibling::*[{num}]' - return self.ele(loc, timeout=1, show_errmsg=False) + return self.ele(loc, timeout=0.01, show_errmsg=False) def attr(self, attr: str) -> str: """获取属性值 \n