From 5e5ca4fa26075a04315e8939f9b052e7b9ca1402 Mon Sep 17 00:00:00 2001 From: g1879 Date: Mon, 29 Nov 2021 16:50:35 +0800 Subject: [PATCH] =?UTF-8?q?input=5Ftxt()=E5=8A=9F=E8=83=BD=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E5=88=B0input()=E9=87=8C=EF=BC=9B=E4=BF=AE=E6=94=B9te?= =?UTF-8?q?xt=E5=B1=9E=E6=80=A7=E8=8E=B7=E5=8F=96=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=EF=BC=88=E5=BE=85=E6=B5=8B=E8=AF=95=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DrissionPage/driver_element.py | 56 ++++++++++++++++------------------ 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/DrissionPage/driver_element.py b/DrissionPage/driver_element.py index d4df95a..1940598 100644 --- a/DrissionPage/driver_element.py +++ b/DrissionPage/driver_element.py @@ -6,8 +6,7 @@ """ from os import sep from pathlib import Path -from re import sub -from time import time +from time import time, perf_counter from typing import Union, List, Any, Tuple from selenium.common.exceptions import TimeoutException, JavascriptException, InvalidElementStateException @@ -81,10 +80,10 @@ class DriverElement(DrissionElement): @property def text(self) -> str: """返回元素内所有文本""" - # return format_html(self.inner_ele.get_attribute('innerText'), False) - re_str = self.inner_ele.get_attribute('innerText') - re_str = sub(r'\n{2,}', '\n', re_str) - re_str = sub(r' {2,}', ' ', re_str) + re_str = self.inner_ele.text + # re_str = self.inner_ele.get_attribute('innerText') + # re_str = sub(r'\n{2,}', '\n', re_str) + # re_str = sub(r' {2,}', ' ', re_str) return format_html(re_str.strip('\n '), False) @@ -282,7 +281,6 @@ class DriverElement(DrissionElement): """ if not by_js: timeout = timeout if timeout is not None else self.page.timeout - from time import perf_counter t1 = perf_counter() while perf_counter() - t1 <= timeout: try: @@ -340,37 +338,35 @@ class DriverElement(DrissionElement): from selenium.webdriver import ActionChains ActionChains(self.page.driver).move_to_element_with_offset(self.inner_ele, x, y).context_click().perform() - def input(self, vals: Union[str, tuple], clear: bool = True) -> None: - """输入文本或组合键,可用于所有场合 \n + def input(self, vals: Union[str, tuple], clear: bool = True, insure_input: bool = True) -> None: + """输入文本或组合键,可用于所有场合 \n :param vals: 文本值或按键组合 :param clear: 输入前是否清空文本框 + :param insure_input: 确保输入正确,解决文本框有时输入失效的问题,不能用于输入组合键 :return: None """ - if clear: - self.clear() - - self.inner_ele.send_keys(*vals) - - def input_txt(self, txt: Union[str, tuple], clear: bool = True) -> None: - """专门用于输入文本框,解决文本框有时输入失效的问题 \n - :param txt: 文本值 - :param clear: 输入前是否清空文本框 - :return: None - """ - enter = '\n' if txt.endswith('\n') else None - full_txt = txt if clear else f'{self.attr("value")}{txt}' - full_txt = full_txt.rstrip('\n') - from time import perf_counter - - t1 = perf_counter() - while self.attr('value') != full_txt and perf_counter() - t1 > self.page.timeout: + if not insure_input: # 普通输入 if clear: self.clear() - self.inner_ele.send_keys(txt) + self.inner_ele.send_keys(*vals) - if enter: - self.inner_ele.send_keys(enter) + else: # 确保输入正确 + if not isinstance(vals, str): + raise TypeError('insure_input参数生效时只能接收str数据。') + enter = '\n' if vals.endswith('\n') else None + full_txt = vals if clear else f'{self.attr("value")}{vals}' + full_txt = full_txt.rstrip('\n') + + t1 = perf_counter() + while self.is_valid() and self.attr('value') != full_txt and perf_counter() - t1 <= self.page.timeout: + if clear: + self.clear() + + self.inner_ele.send_keys(vals) + + if enter: + self.inner_ele.send_keys(enter) def run_script(self, script: str, *args) -> Any: """执行js代码,传入自己为第一个参数 \n