From 16755abad6f0157611812655e101e75ef930362b Mon Sep 17 00:00:00 2001 From: g1879 Date: Tue, 11 Aug 2020 17:41:53 +0800 Subject: [PATCH] =?UTF-8?q?=E9=92=88=E5=AF=B9css=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E7=9A=84=E5=B0=8F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DrissionPage/driver_element.py | 13 ++++++------- DrissionPage/session_element.py | 5 +++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/DrissionPage/driver_element.py b/DrissionPage/driver_element.py index 1a6cc70..0b3599d 100644 --- a/DrissionPage/driver_element.py +++ b/DrissionPage/driver_element.py @@ -163,6 +163,9 @@ class DriverElement(DrissionElement): # 确保查询语句最前面是. loc_str = f'.{loc_or_str[1]}' if not loc_or_str[1].startswith('.') else loc_or_str[1] loc_or_str = loc_or_str[0], loc_str + else: + if loc_or_str[1].lstrip().startswith('>'): + raise ValueError('WebElement does not support getting direct child elements.') timeout = timeout or self.timeout return execute_driver_find(self.inner_ele, loc_or_str, mode, show_errmsg, timeout) @@ -405,19 +408,15 @@ def execute_driver_find(page_or_ele: Union[WebElement, WebDriver], mode = mode or 'single' if mode not in ['single', 'all']: raise ValueError("Argument mode can only be 'single' or 'all'.") - msg = result = None try: wait = WebDriverWait(page_or_ele, timeout=timeout) if mode == 'single': - msg = 'Element not found.' - result = DriverElement(wait.until(ec.presence_of_element_located(loc))) + return DriverElement(wait.until(ec.presence_of_element_located(loc))) elif mode == 'all': - msg = 'Elements not found.' eles = wait.until(ec.presence_of_all_elements_located(loc)) - result = [DriverElement(ele) for ele in eles] - return result + return [DriverElement(ele) for ele in eles] except: if show_errmsg: - print(msg, loc) + print('Element(s) not found.', loc) raise return [] if mode == 'all' else None diff --git a/DrissionPage/session_element.py b/DrissionPage/session_element.py index ab4e4e2..26fcdf9 100644 --- a/DrissionPage/session_element.py +++ b/DrissionPage/session_element.py @@ -123,7 +123,8 @@ class SessionElement(DrissionElement): # Element的html是包含自己的,要如下处理,使其只检索下级的 loc_str = loc_or_str[1] if loc_or_str[1].startswith('.') else f'.{loc_or_str[1]}' elif loc_or_str[0] == 'css selector': - loc_str = f':root>{self.tag}{loc_or_str[1]}' + loc_str = loc_or_str[1] if loc_or_str[1][0] in '>, ' else f' {loc_or_str[1]}' + loc_str = f':root>{self.tag}{loc_str}' loc_or_str = loc_or_str[0], loc_str return execute_session_find(self.inner_ele, loc_or_str, mode, show_errmsg) @@ -217,7 +218,7 @@ def execute_session_find(page_or_ele: BaseParser, elif 'HtmlElement' in str(type(page_or_ele.element)): # 从元素查找 elements = page_or_ele.element.xpath(loc_str) ele = [Element(element=e, url=page_or_ele.url) for e in elements] - else: + else: # 用css selector获取 ele = page_or_ele.find(loc_str) if mode == 'single':