summaryrefslogtreecommitdiff
path: root/qutebrowser/components
diff options
context:
space:
mode:
authorNicholas Schwab <git@nicholas-schwab.de>2021-07-19 19:16:34 +0200
committerNicholas Schwab <git@nicholas-schwab.de>2022-04-01 20:27:07 +0200
commit47de400b0bb676faef6cff7832d4b9ad7604b434 (patch)
treefbcdfd70a2910a17e293680d41a1a80237968f69 /qutebrowser/components
parente5b17bf3b0c73650e5a4f4d0860dab036fcd4b79 (diff)
downloadqutebrowser-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.py33
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)