Safely with retries.

This commit is contained in:
sfigato 2019-01-28 18:15:22 +01:00 committed by blallo
parent 589d95b5ac
commit ed1e267b41
Signed by: blallo
GPG Key ID: 0CBE577C9B72DC3F

View File

@ -32,6 +32,9 @@ from selenium.common.exceptions import (
) # noqa ) # noqa
# TODO: read it from configuration.
RETRIES = 3
logging.basicConfig( logging.basicConfig(
level=os.environ.get("BOTZ_LOGLEVEL", logging.INFO), level=os.environ.get("BOTZ_LOGLEVEL", logging.INFO),
format="%(levelname)s: [%(name)s] -> %(message)s", format="%(levelname)s: [%(name)s] -> %(message)s",
@ -40,18 +43,26 @@ logging.basicConfig(
m_logger = logging.getLogger(__name__) m_logger = logging.getLogger(__name__)
m_logger.debug("Init at debug") m_logger.debug("Init at debug")
def safely(retries: int = 0) -> T.Callable:
def safely(f: T.Callable) -> T.Callable: def _safely(f: T.Callable) -> T.Callable:
def _protection(self, *args, **kwargs): def _protection(self, *args, **kwargs):
done = False
while done or retries >= 0:
try: try:
f(self, *args, **kwargs) f(self, *args, **kwargs)
done = True
except WebDriverException as e: except WebDriverException as e:
self.logger.error("Something went wrong: %s", e) self.logger.error(
"Something went wrong: %s [tentative #%s]", e, retries
)
retries -= 1
finally: finally:
self.switch_to.default_content() self.switch_to.default_content()
return _protection return _protection
return _safely
def _is_present(driver: wd.Firefox, xpath: str) -> bool: def _is_present(driver: wd.Firefox, xpath: str) -> bool:
try: try:
@ -98,6 +109,7 @@ class Operator(wd.Firefox):
""" """
Adds some configuration to Firefox. Adds some configuration to Firefox.
""" """
self.retries = RETRIES
self.profile = wd.FirefoxProfile() self.profile = wd.FirefoxProfile()
# Do not send telemetry # Do not send telemetry
self.profile.set_preference("datareporting.policy.dataSubmissionEnabled", False) self.profile.set_preference("datareporting.policy.dataSubmissionEnabled", False)
@ -132,7 +144,7 @@ class Operator(wd.Firefox):
self._logged_in = False self._logged_in = False
self._checked_in = False self._checked_in = False
@safely @safely(RETRIES)
def login(self, user: str, password: str, force: bool = False) -> None: def login(self, user: str, password: str, force: bool = False) -> None:
""" """
Do the login and proceed. Do the login and proceed.
@ -183,7 +195,7 @@ class Operator(wd.Firefox):
else: else:
self.logger.error("Login failed: %s", user) self.logger.error("Login failed: %s", user)
@safely @safely(RETRIES)
def logout(self, user: str, force: bool = False) -> None: def logout(self, user: str, force: bool = False) -> None:
""" """
Do the logout. Do the logout.
@ -219,7 +231,14 @@ class Operator(wd.Firefox):
_cookies = "dtLatC" in cookies _cookies = "dtLatC" in cookies
return _right_url and _cookies return _right_url and _cookies
@safely @property
def checked_in(self) -> bool:
"""
Check if the user is checked in already.
"""
return self._checked_in
@safely(RETRIES)
def check_in(self, force: bool = False) -> None: def check_in(self, force: bool = False) -> None:
""" """
Click the check in button. Click the check in button.
@ -239,9 +258,9 @@ class Operator(wd.Firefox):
enter_butt.click() enter_butt.click()
# Click the check in button and change # Click the check in button and change
# self._checked_in state in case of success # self._checked_in state in case of success
pass self._checked_in = True
@safely @safely(RETRIES)
def check_out(self, force: bool = False) -> None: def check_out(self, force: bool = False) -> None:
""" """
Click the check out button. Click the check out button.
@ -261,7 +280,7 @@ class Operator(wd.Firefox):
exit_butt.click() exit_butt.click()
# Click the check in button and change # Click the check in button and change
# self._checked_in state in case of success # self._checked_in state in case of success
pass self._checked_in = False
def __del__(self) -> None: def __del__(self) -> None:
self.quit() self.quit()