From e0d4b376554b0a87cec45bdc7a37babe459feb67 Mon Sep 17 00:00:00 2001 From: g1879 Date: Mon, 10 Aug 2020 23:43:28 +0800 Subject: [PATCH] =?UTF-8?q?DrissinElement=E5=A2=9E=E5=8A=A0xpath=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=EF=BC=8C=E6=9C=AA=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DrissionPage/common.py | 21 +++++++++++++++++++-- DrissionPage/driver_element.py | 6 +++--- 2 files changed, 22 insertions(+), 5 deletions(-) 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