Перейти к содержимому

Техники локализации плавающих дефектов
онлайн, начало 19 апреля
Тестирование безопасности
онлайн, начало 21 апреля
Тестирование мобильных приложений
онлайн, начало 21 апреля
Автоматизатор мобильных приложений
онлайн, начало 21 апреля

SergeyQA

Регистрация: 27 янв 2018
Offline Активность: 28 окт 2020 16:26
*----

Мои темы

Ошибка при ресайзе страницы после перехода на Chrome 86

27 октября 2020 - 16:35

Всем доброго дня!

Постараюсь последовательно все пояснить.
Все работало стабильно, но 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.

Почему возникает эта проблема? Баг драйвера? Как решить эту проблему? 
Нам важно делать скришнот именно полной страницы, а не только видимой обрасти. 

 


Яндекс.Метрика
Реклама на портале