В настоящее время я пытаюсь сделать снимок экрана с помощью Selenium WebDriver. Но я могу получить только снимок экрана целой страницы. Однако я хотел просто захватить часть страницы или, возможно, только определенный элемент на основе идентификатора или любого конкретного локатора элемента. (Например, я хочу сделать снимок с image id = "Butterfly")
Есть ли способ сделать снимок экрана по выбранному элементу или элементу?
Ответы:
Мы можем получить снимок экрана элемента, обрезав снимок всей страницы, как показано ниже:
driver.get("http://www.google.com"); WebElement ele = driver.findElement(By.id("hplogo")); // Get entire page screenshot File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); BufferedImage fullImg = ImageIO.read(screenshot); // Get the location of element on the page Point point = ele.getLocation(); // Get width and height of the element int eleWidth = ele.getSize().getWidth(); int eleHeight = ele.getSize().getHeight(); // Crop the entire page screenshot to get only element screenshot BufferedImage eleScreenshot= fullImg.getSubimage(point.getX(), point.getY(), eleWidth, eleHeight); ImageIO.write(eleScreenshot, "png", screenshot); // Copy the element screenshot to disk File screenshotLocation = new File("C:\\images\\GoogleLogo_screenshot.png"); FileUtils.copyFile(screenshot, screenshotLocation);
источник
Вот версия Python 3 с использованием Selenium webdriver и Pillow. Эта программа делает снимок экрана всей страницы и обрезает элемент в зависимости от его местоположения. Изображение элемента будет доступно как image.png. Firefox поддерживает сохранение изображения элемента напрямую с помощью element.screenshot_as_png ('image_name').
Обновить
Теперь Chrome также поддерживает скриншоты отдельных элементов. Таким образом, вы можете напрямую сделать снимок экрана веб-элемента, как показано ниже.
источник
element.size
это указано в точках, тогда как снимок экрана, созданный с помощью,driver.save_screenshot
имеет размеры в пикселях. Если на вашем экране соотношение пикселей к точкам отличается от 1 (например, у Retina MacBook есть два пикселя на точку - соотношение 2), то вам необходимо умножитьw
иh
на это соотношение.from StringIO import StringIO; from PIL import Image; img = Image.open(StringIO(image))
import io; from PIL import Image; img = Image.open(io.BytesIO(image)); img.save("image.png")
В
Node.js
я написал следующий код, который работает, но основан не на официальном WebDriverJS Selenium , а наSauceLabs's WebDriver
: WD.js и очень компактной библиотеке изображений EasyImage .Я просто хочу подчеркнуть, что на самом деле вы не можете сделать снимок экрана элемента, но что вам следует сделать, это сначала сделать снимок экрана всей страницы, затем выбрать часть страницы, которая вам нравится, и обрезать эту конкретную часть:
И функция cropInFileFunction выглядит так:
источник
Фреймворк ASHOT от Яндекса можно использовать для снятия скриншотов в скриптах Selenium WebDriver для
Этот фреймворк можно найти на https://github.com/yandex-qatools/ashot .
Код для создания снимков экрана очень прост:
ВСЯ СТРАНИЦА
СПЕЦИАЛЬНЫЙ ВЕБ-ЭЛЕМЕНТ
Дополнительные сведения и примеры кода см. В этой статье .
источник
.shootingStrategy(ShootingStrategies.viewportPasting(100))
также сSPECIFIC WEB ELEMENT
режимом, или он не может охватить весь элемент.Для всех, кто интересуется кодом на C #, ниже представлена упрощенная версия моей реализации.
источник
Я потратил много времени на создание скриншотов, и хочу сохранить ваш. Я использовал хром + селен + С #, результат был ужасным. Наконец, я написал функцию:
источник
Ответ Сурьи отлично работает, если вы не против использования дискового ввода-вывода. Если вы не хотите, то этот метод может быть лучше для вас.
Если вы предпочитаете, вы можете пропустить объявление
screengrab
и вместо этого сделатькоторый чище, но я оставил его для ясности. Затем вы можете сохранить его как файл или поместить в JPanel, сколько душе угодно.
источник
Python 3
Пробовал с Selenium 3.141.0 и chromedriver 73.0.3683.68, это работает,
Не нужно получать полное изображение и получать часть полноэкранного изображения.
Это могло быть недоступно, когда был создан ответ Рохита .
источник
источник
Если вы ищете решение для JavaScript, вот моя суть:
https://gist.github.com/sillicon/4abcd9079a7d29cbb53ebee547b55fba
Основная идея та же, сначала сделайте снимок экрана, а затем обрежьте его. Однако для моего решения не потребуются другие библиотеки, только чистый код API WebDriver. Однако побочным эффектом является то, что это может увеличить нагрузку на ваш тестируемый браузер.
источник
Вот функция расширения для C #:
Теперь вы можете использовать его для получения изображения любого элемента, например:
источник
Рассмотрите возможность использования иглы - инструмента для автоматического визуального сравнения https://github.com/bfirsh/needle , который имеет встроенную функциональность, позволяющую делать скриншоты определенных элементов (выбранных селектором CSS). Инструмент работает на Selenium WebDriver и написан на Python.
источник
Ниже функция для создания снимка определенного элемента в Selenium. Здесь драйвер - это разновидность WebDriver.
источник
код c #:
источник
источник
Если вы получаете исключение java.awt.image.RasterFormatException в chrome или хотите прокрутить элемент в поле зрения, сделайте снимок экрана.
Вот решение из ответа @Surya.
источник
Это моя версия на C #, я в основном получил большую часть ответа Брука и изменил его в соответствии со своей целью
источник
Я думаю, что большинство ответов здесь излишне искусно. Я сделал это с помощью двух вспомогательных методов, первый из которых ожидал элемента на основе любого селектора; а второй сделать снимок экрана.
Примечание: мы приводим
WebElement
кTakesScreenshot
экземпляру, поэтому мы специально фиксируем только этот элемент в изображении. Если вам нужна полная страница / окно, вы должныdriver
вместо этого выполнить трансляцию .WebDriver driver = new FirefoxDriver(); // define this somewhere (or chrome etc) public <T> T screenshotOf(By by, long timeout, OutputType<T> type) { return ((TakesScreenshot) waitForElement(by, timeout)) .getScreenshotAs(type); } public WebElement waitForElement(By by, long timeout) { return new WebDriverWait(driver, timeout) .until(driver -> driver.findElement(by)); }
А затем просто сделайте снимок экрана, что хотите, вот так:
long timeout = 5; // in seconds /* Screenshot (to file) based on first occurence of tag */ File sc = screenshotOf(By.tagName("body"), timeout, OutputType.FILE); /* Screenshot (in memory) based on CSS selector (e.g. first image in body who's "src" attribute starts with "https") */ byte[] sc = screenshotOf(By.cssSelector("body > img[href^='https']"), timeout, OutputType.BYTES);
источник
Я считаю, что это не сработает для вас, поскольку вы используете C #, а мое решение включает библиотеку Java, однако, возможно, другие сочтут это полезным.
Для создания пользовательских снимков экрана вы можете использовать библиотеку Shutterbug. Конкретный вызов для этой цели будет:
источник
Я последовал примеру кода из @codeslord, но по какой-то причине мне пришлось по-другому обращаться к данным моего скриншота:
# Open the Firefox webdriver driver = webdriver.Firefox() # Find the element that you're interested in imagepanel = driver.find_element_by_class_name("panel-height-helper") # Access the data bytes for the web element datatowrite = imagepanel.screenshot_as_png # Write the byte data to a file outfile = open("imagepanel.png", "wb") outfile.write(datatowrite) outfile.close()
(с использованием Python 3.7, Selenium 3.141.0 и Mozilla Geckodriver 71.0.0.7222)
источник
Я использую модифицированную версию ответа @Brook и отлично работает даже для элементов, для которых требуется прокрутка страницы.
Эти два
if
s были необходимы (по крайней мере, для драйвера Chrome), потому что размер кадрирования на 1 пиксель превышал размер скриншота, когда требовалась прокрутка.источник