Spaces:
Runtime error
Runtime error
| from typing import List | |
| from selenium.webdriver.common.by import By | |
| import selenium.webdriver.remote.webelement | |
| class WebElement(selenium.webdriver.remote.webelement.WebElement): | |
| def click_safe(self): | |
| super().click() | |
| self._parent.reconnect(0.1) | |
| def children( | |
| self, tag=None, recursive=False | |
| ) -> List[selenium.webdriver.remote.webelement.WebElement]: | |
| """ | |
| returns direct child elements of current element | |
| :param tag: str, if supplied, returns <tag> nodes only | |
| """ | |
| script = "return [... arguments[0].children]" | |
| if tag: | |
| script += ".filter( node => node.tagName === '%s')" % tag.upper() | |
| if recursive: | |
| return list(_recursive_children(self, tag)) | |
| return list(self._parent.execute_script(script, self)) | |
| class UCWebElement(WebElement): | |
| """ | |
| Custom WebElement class which makes it easier to view elements when | |
| working in an interactive environment. | |
| standard webelement repr: | |
| <selenium.webdriver.remote.webelement.WebElement (session="85ff0f671512fa535630e71ee951b1f2", element="6357cb55-92c3-4c0f-9416-b174f9c1b8c4")> | |
| using this WebElement class: | |
| <WebElement(<a class="mobile-show-inline-block mc-update-infos init-ok" href="#" id="main-cat-switcher-mobile">)> | |
| """ | |
| def __init__(self, parent, id_): | |
| super().__init__(parent, id_) | |
| self._attrs = None | |
| def attrs(self): | |
| if not self._attrs: | |
| self._attrs = self._parent.execute_script( | |
| """ | |
| var items = {}; | |
| for (index = 0; index < arguments[0].attributes.length; ++index) | |
| { | |
| items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value | |
| }; | |
| return items; | |
| """, | |
| self, | |
| ) | |
| return self._attrs | |
| def __repr__(self): | |
| strattrs = " ".join([f'{k}="{v}"' for k, v in self.attrs.items()]) | |
| if strattrs: | |
| strattrs = " " + strattrs | |
| return f"{self.__class__.__name__} <{self.tag_name}{strattrs}>" | |
| def _recursive_children(element, tag: str = None, _results=None): | |
| """ | |
| returns all children of <element> recursively | |
| :param element: `WebElement` object. | |
| find children below this <element> | |
| :param tag: str = None. | |
| if provided, return only <tag> elements. example: 'a', or 'img' | |
| :param _results: do not use! | |
| """ | |
| results = _results or set() | |
| for element in element.children(): | |
| if tag: | |
| if element.tag_name == tag: | |
| results.add(element) | |
| else: | |
| results.add(element) | |
| results |= _recursive_children(element, tag, results) | |
| return results | |