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

Фотография

Как в автотестах python+selenium делать полностаничные скриншоты?

selenium python

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

#1 PopkovSergei

PopkovSergei

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

  • Members
  • Pip
  • 14 сообщений
  • ФИО:Попков Сергей


Отправлено 24 июня 2020 - 11:46

Думал что вопрос популярный, но гугл подкидывает либо переусложнённые решения либо просто не рабочие.

 

Вот этот вариант выглядит адекватным, но совершенно не работает: 

element = driver.find_element(By.TAG_NAME, 'body')
element.screenshot("screenshot_full.png")

И этот тоже:

element = driver.find_element_by_tag_name('body')
element_png = element.screenshot_as_png
with open("test2.png", "wb") as file:
file.write(element_png)

На скриншот попадает только видимая часть страницы, а нужна страница целиком.

 

Подскажите пожалуйста рабочие варианты?


  • 0

#2 Gleb_Kazarkin

Gleb_Kazarkin

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

  • Members
  • Pip
  • 18 сообщений

Отправлено 29 июня 2020 - 10:11

driver.get_screenshot_as_file('name.png')
Но сохраняет его в каталог с тестами


  • 0

#3 vladMat

vladMat

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

  • Members
  • Pip
  • 13 сообщений

Отправлено 02 июля 2020 - 03:25

Была у меня аналогичная задача. Стандартное .find_element_by_xpath(location).screenshot_as_png работало хорошо в firefox, в chrome не работало, если не ошибаюсь. Тогда в интернете нашел вариант ниже. Он снимает скриншот видимой области, прокручивает страницу, делает еще скриншот, и так далее. Потом все это склеивает в один скриншот. Данное решение работает в firefox, chrome, safari. Проблема возникнет, если на сайте есть закрепленные элементы, на склеенном скриншоте они будут повторяться (пример: закрепленная шапка сайта в мобильной версии)

 .

from io import BytesIO
from selenium import webdriver
from PIL import Image, ImageChops, ImageDraw


def full_screenshot(browser: webdriver, offset: int = 0) -> Image:
    """ Получение полного скриншота содержимого окна браузера
        offset - начальное смещение"""

    img_list = []  # для хранения фрагментов изображения

    # Определение размера окна браузера
    height = browser.execute_script("""return Math.max(
                                           document.documentElement.clientHeight,
                                           window.innerHeight
                                       );""")

    # Определение высоты содержимого окна браузера
    max_window_height = browser.execute_script("""return Math.max(
                                                      document.body.scrollHeight,
                                                      document.body.offsetHeight,
                                                      document.documentElement.clientHeight,
                                                      document.documentElement.scrollHeight,
                                                      document.documentElement.offsetHeight
                                                  );""")

    # Скроллим страницу и добавляем скриншот видимого окна браузера в img_list
    while offset < max_window_height:
        browser.execute_script(f"window.scrollTo(0, {offset});")

        img = Image.open(BytesIO((browser.get_screenshot_as_png())))
        img_list.append(img)

        offset += height

    # Обрезание последнего изображения
    box = (0, height - height * (max_window_height / height - max_window_height // height), img_list[-1].size[0],
           img_list[-1].size[1])
    img_list[-1] = img_list[-1].crop(box)

    # Определение размеров нового изображения, создание холста
    img_frame_height = sum([img_frag.size[1] for img_frag in img_list])
    img_frame = Image.new('RGB', (img_list[0].size[0], img_frame_height))

    # Объединение изображений в одно
    offset = 0
    for img_fragment in img_list:
        img_frame.paste(img_fragment, (0, offset))
        offset += img_fragment.size[1]

    return img_frame

 


  • 0



Темы с аналогичным тегами selenium, python

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

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