Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 32 additions & 15 deletions mops/selenium/core/core_element.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,23 @@
)


def drop_element_cache(obj):
obj._element = None
if obj.parent:
drop_element_cache(obj.parent)


def refetch(func):

def decorator(*args, **kwargs):
try:
return func(*args, **kwargs)
except:
drop_element_cache(args[0])
return func(*args, **kwargs)
return decorator


class CoreElement(ElementABC, ABC):

parent: Union[ElementABC, CoreElement]
Expand Down Expand Up @@ -407,7 +424,7 @@ def is_displayed(self, silent: bool = False) -> bool:
is_displayed = self.is_available()

if is_displayed:
is_displayed = safe_call(self._cached_element.is_displayed)
is_displayed = safe_call(self.element.is_displayed)

return is_displayed

Expand Down Expand Up @@ -541,20 +558,18 @@ def _get_element(self, wait: Union[bool, Callable] = True, force_wait: bool = Fa
:param force_wait: force wait for some element
:return: SeleniumWebElement
"""
element = self._element
element = None

if wait is True:
wait = self.wait_visibility

if not element:

# Try to get element instantly without wait. Skipped if force_wait given
if not force_wait:
element = safe_call(self._find_element, wait_parent=False)
# Try to get element instantly without wait. Skipped if force_wait given
if not force_wait:
element = safe_call(self._find_element, wait_parent=False)

# Wait for element if it is not found instantly
if (not element and wait) or force_wait:
element = self._get_cached_element(safe_call(wait, silent=True))
# Wait for element if it is not found instantly
if (not element and wait) or force_wait:
element = self._get_cached_element(safe_call(wait, silent=True))

if not element:
if self.parent and not self._get_cached_element(self.parent):
Expand Down Expand Up @@ -588,6 +603,7 @@ def _get_base(self, wait: Union[bool, Callable] = True) -> Union[SeleniumWebDriv

return base

@refetch
def _find_element(self, wait_parent: bool = False) -> Union[SeleniumWebElement, AppiumWebElement]:
"""
Find selenium/appium element
Expand All @@ -596,11 +612,13 @@ def _find_element(self, wait_parent: bool = False) -> Union[SeleniumWebElement,
:return: SeleniumWebElement or AppiumWebElement
"""
base = self._get_base(wait=wait_parent)
self._cached_element = None

if self._element:
return self._element

try:
element = base.find_element(self.locator_type, self.locator)
self._cached_element = element
self._element = element
return element
except (SeleniumInvalidArgumentException, SeleniumInvalidSelectorException) as exc:
self._raise_invalid_selector_exception(exc)
Expand All @@ -615,13 +633,12 @@ def _find_elements(self, wait_parent: bool = False) -> List[Union[SeleniumWebEle
:return: list of SeleniumWebElement or AppiumWebElement
"""
base = self._get_base(wait=wait_parent)
self._cached_element = None

try:
elements = base.find_elements(self.locator_type, self.locator)

if elements:
self._cached_element = elements[0]
self._element = elements[0]

return elements
except (SeleniumInvalidArgumentException, InvalidSelectorException) as exc:
Expand Down Expand Up @@ -661,4 +678,4 @@ def _get_cached_element(self, obj: CoreElement) -> Union[None, SeleniumWebElemen
:param obj: CoreElement object
:return: None, SeleniumWebElement, AppiumWebElement
"""
return getattr(obj, '_cached_element', None)
return getattr(obj, '_element', None)
Loading