import osclass BrowserSnapshot():SNAPSHOT_NUMBER = 0@classmethoddef new(cls, browser):browser.snapshot(f'snapshot-{browser.label}', str(cls.SNAPSHOT_NUMBER))cls.SNAPSHOT_NUMBER += 1def log_step(snapshots=False, snapshot_before=False, snapshot_after=False, docstring=False):""" Decorator for logging steps durring testing.Decorated function needs to be part of class with self.browser.:param snapshots: Create snapshots before and after function call, defaults to False:type snapshots: bool, optional:param snapshot_before: Create snapshots before function call, defaults to False:type snapshot_before: bool, optional:param snapshot_after: Create snapshots after function call, defaults to False:type snapshot_after: bool, optional:param docstring: Print docstring of the function, defaults to False:type docstring: bool, optional"""def decorator(function):def wrapper(*args, **kwargs):nice_args = ', '.join(str(a) for a in args[1:])if kwargs:nice_args += ', ' + ', '.join(f'{k}: {v}' for k, v in kwargs.items())if nice_args:nice_args = f', with {nice_args}'print(f'[TEST STEP] {function.__name__}{nice_args}')if docstring:print(f'[DOC] {function.__doc__}')ext_logging = bool(int(os.environ.get('EXTENDED_LOGGING', '0')))if ext_logging and (snapshots or snapshot_before):BrowserSnapshot.new(args[0].browser)result = function(*args, **kwargs)if ext_logging and (snapshots or snapshot_after):BrowserSnapshot.new(args[0].browser)return resultreturn wrapperreturn decorator