diff options
author | Nicholas Schwab <git@nicholas-schwab.de> | 2021-07-19 19:16:34 +0200 |
---|---|---|
committer | Nicholas Schwab <git@nicholas-schwab.de> | 2022-04-01 20:27:07 +0200 |
commit | 47de400b0bb676faef6cff7832d4b9ad7604b434 (patch) | |
tree | fbcdfd70a2910a17e293680d41a1a80237968f69 /qutebrowser/components | |
parent | e5b17bf3b0c73650e5a4f4d0860dab036fcd4b79 (diff) | |
download | qutebrowser-47de400b0bb676faef6cff7832d4b9ad7604b434.tar.gz qutebrowser-47de400b0bb676faef6cff7832d4b9ad7604b434.zip |
Split handling of single and multiple elements in click_element.
Diffstat (limited to 'qutebrowser/components')
-rw-r--r-- | qutebrowser/components/misccommands.py | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/qutebrowser/components/misccommands.py b/qutebrowser/components/misccommands.py index abd21b2e2..7203c7f77 100644 --- a/qutebrowser/components/misccommands.py +++ b/qutebrowser/components/misccommands.py @@ -27,7 +27,7 @@ import signal import functools import logging import pathlib -from typing import Optional, Union, List +from typing import Optional, List try: import hunter @@ -244,25 +244,34 @@ def click_element(tab: apitypes.Tab, filter_: str, value: str, *, force_event: Force generating a fake click event. select_first: Select first matching element if there are multiple. """ - def single_cb(elem: Union[apitypes.WebElement, List[apitypes.WebElement], None]) -> None: - """Click a single element.""" - if not elem: - message.error(f"No element found matching {filter_}={value}!") - return - if isinstance(elem, list): - if not select_first and len(elem) > 1: - message.error(f"Multiple elements found matching {filter_}={value}!") - return - elem = elem[0] + def do_click(elem: apitypes.WebElement) -> None: try: elem.click(target, force_event=force_event) except apitypes.WebElemError as e: message.error(str(e)) + + def single_cb(elem: Optional[apitypes.WebElement]) -> None: + """Click a single element.""" + if elem is None: + message.error(f"No element found matching {filter_}={value}!") return + do_click(elem) + + def multiple_cb(elems: List[apitypes.WebElement]) -> None: + if len(elems) == 0: + message.error(f"No element found matching {filter_}={value}!") + return + + if not select_first and len(elems) > 1: + message.error(f"Multiple elements found matching {filter_}={value}!") + return + + do_click(elems[0]) + handlers = { 'id': (tab.elements.find_id, single_cb), - 'css': (tab.elements.find_css, single_cb, message.error), + 'css': (tab.elements.find_css, multiple_cb, message.error), } handler, *callback = handlers[filter_] handler(value, *callback) |