В своих тестах я использую конструкцию:
try: self.assertTrue(page.logo.is_displayed()) except: allure.attach(self.driver.get_screenshot_as_png(), 'screenshot') raise
И задался вопросом закинуть в декоратор try… except…
Что то в этом роде:
def ErrorScreenShot(function_to_decorate): def ExceptionProcess(*args, **kwargs): try: function_to_decorate(*args, **kwargs) except: allure.attach(driver.get_screenshot_as_png(), 'screenshot') raise return ExceptionProcess @ErrorScreenShot def VerifyEqual(a, b, comment="Actual and expected results aren't equal"): assert a == b, comment
Чтобы при вызове функции:
VerifyEqual(1, 3, "1 не равно 3")
Получить скрин и AssertError: "1 не равно 3"
Но тут дилемма как передать в декоратор selenium driver, который используется в тестовом коде?
Анонимный пользователь Изменен статус публикации
Если декоратор только к методам нужно применять:
@screenshot_on_failure def test_something(self): self.assertTrue(page.logo.isdisplayed())
тогда первый аргумент всегда self
:
def screenshot_on_failure(method): @functools.wraps(method) def wrapper(self, *args, **kwargs): try: return method(self, *args, **kwargs) except Exception: # use self.driver here raise return wrapper