From ef41df46294aa1be2e114d4dfc1e276b76861f2e Mon Sep 17 00:00:00 2001 From: g1879 Date: Sat, 3 Apr 2021 22:42:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96Select=E7=B1=BB=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DrissionPage/driver_element.py | 101 +++++++++++++++------------------ 1 file changed, 45 insertions(+), 56 deletions(-) diff --git a/DrissionPage/driver_element.py b/DrissionPage/driver_element.py index ca8cf04..bd5b88d 100644 --- a/DrissionPage/driver_element.py +++ b/DrissionPage/driver_element.py @@ -785,6 +785,18 @@ class Select(object): self.inner_ele = ele self.select_ele = sl(ele.inner_ele) + def __call__(self, + text_value_index: Union[str, int, list, tuple] = None, + para_type: str = 'text', + deselect: bool = False) -> bool: + """选定或取消选定下拉列表中子元素 \n + :param text_value_index: 根据文本、值选或序号择选项,若允许多选,传入list或tuple可多选 + :param para_type: 参数类型,可选 'text'、'value'、'index' + :param deselect: 是否取消选择 + :return: 是否选择成功 + """ + return self.select(text_value_index, para_type, deselect) + @property def is_multi(self) -> bool: """返回是否多选表单""" @@ -816,42 +828,55 @@ class Select(object): def select(self, text_value_index: Union[str, int, list, tuple] = None, - para_type: str = 'text') -> bool: - """选定下拉列表中子元素 \n + para_type: str = 'text', + deselect: bool = False) -> bool: + """选定或取消选定下拉列表中子元素 \n :param text_value_index: 根据文本、值选或序号择选项,若允许多选,传入list或tuple可多选 - :param para_type: 参数类型,可选'text'、'value'、'index' + :param para_type: 参数类型,可选 'text'、'value'、'index' + :param deselect: 是否取消选择 :return: 是否选择成功 """ - if para_type not in ('text', 'value', 'index'): - raise ValueError('para_type参数只能传入“text”、“value”或“index”') - if not self.is_multi and isinstance(text_value_index, (list, tuple)): raise TypeError('单选下拉列表不能传入list和tuple') if isinstance(text_value_index, (str, int)): try: if para_type == 'text': - self.select_ele.select_by_visible_text(text_value_index) + if deselect: + self.select_ele.deselect_by_visible_text(text_value_index) + else: + self.select_ele.select_by_visible_text(text_value_index) elif para_type == 'value': - self.select_ele.select_by_value(text_value_index) + if deselect: + self.select_ele.deselect_by_value(text_value_index) + else: + self.select_ele.select_by_value(text_value_index) elif para_type == 'index': - self.select_ele.select_by_index(int(text_value_index)) + if deselect: + self.select_ele.deselect_by_index(int(text_value_index)) + else: + self.select_ele.select_by_index(int(text_value_index)) + else: + raise ValueError('para_type参数只能传入"text"、"value"或"index"。') return True + except: return False elif isinstance(text_value_index, (list, tuple)): - self.select_multi(text_value_index, para_type) + self.select_multi(text_value_index, para_type, deselect) else: raise TypeError('只能传入str、int、list和tuple类型。') def select_multi(self, text_value_index: Union[list, tuple] = None, - para_type: str = 'text') -> Union[bool, list]: - """选定下拉列表中多个子元素 \n + para_type: str = 'text', + deselect: bool = False) -> Union[bool, list]: + """选定或取消选定下拉列表中多个子元素 \n :param text_value_index: 根据文本、值选或序号择选项,若允许多选,传入list或tuple可多选 - :param para_type: 参数类型,可选'text'、'value'、'index' + :param para_type: 参数类型,可选 'text'、'value'、'index' + :param deselect: 是否取消选择 :return: 是否选择成功 """ if para_type not in ('text', 'value', 'index'): @@ -863,7 +888,7 @@ class Select(object): if not isinstance(i, (int, str)): raise TypeError('列表只能由str或int组成') - if not self.select(i, para_type): + if not self.select(i, para_type, deselect): fail_list.append(i) return fail_list or True @@ -876,59 +901,23 @@ class Select(object): para_type: str = 'text') -> bool: """取消选定下拉列表中子元素 \n :param text_value_index: 根据文本、值选或序号择选项,若允许多选,传入list或tuple可多选 - :param para_type: 参数类型,可选'text'、'value'、'index' + :param para_type: 参数类型,可选 'text'、'value'、'index' :return: 是否选择成功 """ - if para_type not in ('text', 'value', 'index'): - raise ValueError('para_type参数只能传入“text”、“value”或“index”') - - if not self.is_multi and isinstance(text_value_index, (list, tuple)): - raise TypeError('单选下拉列表不能传入list和tuple') - - if isinstance(text_value_index, (str, int)): - try: - if para_type == 'text': - self.select_ele.deselect_by_visible_text(text_value_index) - elif para_type == 'value': - self.select_ele.deselect_by_value(text_value_index) - elif para_type == 'index': - self.select_ele.deselect_by_index(int(text_value_index)) - return True - except: - return False - - elif isinstance(text_value_index, (list, tuple)): - self.deselect_multi(text_value_index, para_type) - - else: - raise TypeError('只能传入str、int、list和tuple类型。') + return self.select(text_value_index, para_type, True) def deselect_multi(self, text_value_index: Union[list, tuple] = None, para_type: str = 'text') -> Union[bool, list]: """取消选定下拉列表中多个子元素 \n :param text_value_index: 根据文本、值选或序号择选项,若允许多选,传入list或tuple可多选 - :param para_type: 参数类型,可选'text'、'value'、'index' + :param para_type: 参数类型,可选 'text'、'value'、'index' :return: 是否选择成功 """ - if para_type not in ('text', 'value', 'index'): - raise ValueError('para_type参数只能传入“text”、“value”或“index”') + return self.select_multi(text_value_index, para_type, True) - if isinstance(text_value_index, (list, tuple)): - fail_list = [] - for i in text_value_index: - if not isinstance(i, (int, str)): - raise TypeError('列表只能由str或int组成') - - if not self.deselect(i, para_type): - fail_list.append(i) - - return fail_list or True - - else: - raise TypeError('只能传入list或tuple类型。') - - def invert(self): + def invert(self) -> None: + """反选""" if not self.is_multi: raise NotImplementedError("You may only deselect options of a multi-select")