Всем доброго дня!
Постараюсь последовательно все пояснить.
Все работало стабильно, но cлучилось нечто после перехода нами с 85 на Chrome 86.
Тесты стали падать при сохранении скриншота.
Строка, в которой возникают проблемы:
status = driver.instance.save_screenshot(str(screenshot_path_with_file.absolute()))
def create_and_save_screenshot_in_local(self, screenshot_local_storage_data: ScreenshotLocalStorageData) -> bool: """Make and save screenshot in local dir. Return origin screenshot_path_data if success""" dir_path_for_screenshot = screenshot_local_storage_data.local_dir_path screenshot_path_with_file: Path = screenshot_local_storage_data.full_local_screenshot_path pathlib.Path(dir_path_for_screenshot).mkdir(parents=True, exist_ok=True) # Resize to full page for making screenshot driver_actions.resize_window_to_full_page() logging.info(f"Saving screenshot in path: '{screenshot_path_with_file}'") status = driver.instance.save_screenshot(str(screenshot_path_with_file.absolute())) if status: logging.info(f"Successfully saved screenshot in local storage: '{screenshot_path_with_file=}'") return True logging.warning(f"Failed on saving screenshot in '{screenshot_path_with_file=}'") return False
В конечном итоге ошибка такая:
self = <selenium.webdriver.remote.webdriver.WebDriver (session="a6137efb0d5565ad1ae0e0119985a083")> def get_screenshot_as_png(self): """ Gets the screenshot of the current window as a binary data. :Usage: driver.get_screenshot_as_png() """ > return base64.b64decode(self.get_screenshot_as_base64().encode('ascii')) E AttributeError: 'NoneType' object has no attribute 'encode'
До строки, где скришот сохраняется, есть метод, который делает делает ресайз страницы (разворачивает ее полностью).
def resize_window_to_full_page(): """Resize window to full page size""" window_width = int(execute_js('return window.innerWidth')) page_height = int(execute_js('return document.body.scrollHeight')) # Add a few pixels so that the picture is not cropped from the bottom set_window_size(window_width, page_height + 250) # Some processes can be executing after resize, waiting for then waiting_actions.wait_for_ajax() waiting_actions.wait_for_load()
Так вот, тесты стали падать на страницах, высота которых достаточно большая. Причем, как видно из трейса, тест падает не на строках метода ресайза, а именно при сохранении скриншота.
Империческим путем я выяснил, что проблема возникает, если высота страницы более 8100 пикселей.
Если я руками устанавливают значение page_height = 8100, то тесты проходят прекрасно.
Если говорить о физическом поведении браузера, то для падающего теста он ведет себя так: в момент ресайза окно браузера уменьшается, затем через несколько секунд тест падает с вышеупомянутой ошибкой.
Когда высота страницы менее 8100 пикселей, то окно браузера сжимается, затем сразу раскрывается на заданную высоту и ширину, делается и сохраняется скриншот, тест PASS.
Убедился, что ошибка только на 86 версии. При прогоне на 85 версии все тесты PASS.
Почему возникает эта проблема? Баг драйвера? Как решить эту проблему?
Нам важно делать скришнот именно полной страницы, а не только видимой обрасти.