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

Техники локализации плавающих дефектов
онлайн, начало 17 августа
Школа для начинающих тестировщиков
онлайн, начало 20 августа
Программирование на Python для тестировщиков
онлайн, начало 14 августа
Тестирование без требований
онлайн, начало 17 августа
Фотография

Как в автотестах 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
  • 2 сообщений

Отправлено 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 WebDriver: полное руководство
онлайн
Программирование на Python для тестировщиков
онлайн




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

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

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

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