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

Фотография

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


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 3

#1 SergeyQA

SergeyQA

    Новый участник

  • Members
  • Pip
  • 23 сообщений
  • ФИО:Пронякин Сергей
  • Город:Москва

Отправлено 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.

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

 


  • 0

#2 Little_CJIOH

Little_CJIOH

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 515 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


Отправлено 27 октября 2020 - 21:19

на самом деле вопроса 2.

1) почему не получается взять скриншот высоты больше 8100 ( а скорее 8191 или 8192)

2) почему в 86 версии тесты падают.
 и это совершенно разные вопросы.

Вполне возможно что в 85 версии вы просто не берете слишкомбольшой скриншот, потому что тесты не падают, а если уроните специально, то тоже не получите скриншота

Ну а про то почему упали тесты на 86 версии у вас никакой информации нет. ее съело падениесамих тестов на попытке сохранить скриншот.


  • 0

#3 SergeyQA

SergeyQA

    Новый участник

  • Members
  • Pip
  • 23 сообщений
  • ФИО:Пронякин Сергей
  • Город:Москва

Отправлено 28 октября 2020 - 09:50

на самом деле вопроса 2.

1) почему не получается взять скриншот высоты больше 8100 ( а скорее 8191 или 8192)

2) почему в 86 версии тесты падают.
 и это совершенно разные вопросы.

Вполне возможно что в 85 версии вы просто не берете слишкомбольшой скриншот, потому что тесты не падают, а если уроните специально, то тоже не получите скриншота

Ну а про то почему упали тесты на 86 версии у вас никакой информации нет. ее съело падениесамих тестов на попытке сохранить скриншот.

Спасибо за ответ!
Я думаю, что сами тесты (ваш пункт 2) можно в расчет не брать. Проблема именно в захвате скриншота самим селениумом в хроме.
В 85-ой версии я беру точно-такие же большие скриншоты, но тесты проходят. Я это специально проверял. 
А что вы знаете по поводу высоты окна выше 8100? Почему вы дали более точную цифру? что это за цифра в 8191 или 8192?


  • 0

#4 Little_CJIOH

Little_CJIOH

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 515 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


Отправлено 28 октября 2020 - 12:06

На самом деле, про селениюм и хром я ничего не знаю.

про цифры - это ближние значимые числа шестнадцатеричной и двоичной систем. 0xFFFh 0x1000h, вокруг них любят собираться дефекты, тем более что 12 бит (3 hex - символа) опять же может быть значимым числом для base64.

 

Если бы передо мной стояла такая задача то я
1) спросил бы Баранцева, а вдруг он уже знает ответ.

2) погуглил бы на предмет настройки размера буффера кадра для скриншота
3) попробовал бы взять скриншот не base64 возможно это сработает
4) попробовал бы поставить высоту 16384+ особенно если моя догадка про пролегание границы на 8191-8192 подтвердится. вполне возможно что дефект ограничен диапозоном 8192-16383


  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных