Zrzut ekranu pełnej strony – Selenium

Selenium

 826 

Zrzut ekranu pełnej strony – Selenium to wpis w którym pokazujemy jak możemy wykonywać screenshot pełnej strony w przeglądarce. Być może zdarzyło Ci się kiedyś, że potrzebowałeś by zrzut ekranu zawierał tylko część widok niezbędnego przy pracy. Po przeczytaniu tego wpisu, będziesz mieć możliwość korzystania z alternatywnego rozwiązania.

Wprowadzenie

W ramach niniejszego wpisu będziemy opierać się na projekcie aShot, dzięki któremu będziemy mogli wykonywać te czynności. Projekt znajduje się na GitHubie Pavela Zorina. Z opcji można korzystać na przeglądarkach desktopowych, mobilnych, emulatorach.

Testujemy

Pobierz plik oficjalny plik jar lub dodaj do POMa.

<!-- https://mvnrepository.com/artifact/ru.yandex.qatools.ashot/ashot -->
<dependency>
    <groupId>ru.yandex.qatools.ashot</groupId>
    <artifactId>ashot</artifactId>
    <version>1.5.3</version>
</dependency>

Następnie zobacz jak to wygląda w kodzie by móc później zaimplementować to w ramach swoich testów.

import java.io.File;
import java.util.concurrent.TimeUnit;

import javax.imageio.ImageIO;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import ru.yandex.qatools.ashot.AShot;
import ru.yandex.qatools.ashot.Screenshot;
import ru.yandex.qatools.ashot.shooting.ShootingStrategies;

public class FullPageScreenshot 
{
	public static void main(String args[]) throws Exception{
		System.setProperty("webdriver.chrome.driver","C://LokalizacjaDrivera//chromedriver.exe");
		WebDriver driver = new ChromeDriver();
		driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);  
		driver.manage().window().maximize(); 
		driver.get("https://www.AdresStrony.pl");
		Thread.sleep(2000);
		Screenshot fpScreenshot = new AShot().shootingStrategy(ShootingStrategies.viewportPasting(1000)).takeScreenshot(driver);
		ImageIO.write(fpScreenshot.getImage(),"PNG",new File("C://MiejsceNaTwojeScreena//FullPageScreenshot.png"));
		driver.quit();
	}
}

Po skorzystaniu z tego kodu wykonasz zrzut ekranu pełnej strony, przykład poniżej.

Zrzut ekranu pełnej strony - Selenium - pełny zrzut ekranu

Wyjaśnienie kodu:

  • ShootingStrategies – jest to wbudowana strategia zawarta w aShot.java;
  • viewportPasting – odnośni się do przewijania podczas screenshota;
  • 1000 (konfigurowalna wartość) – scrollTimeout czas pomiędzy każdym viewportPasting w ms;
  • takeScreenshot – wykonanie zrzutu ekranu;
  • ImageIO – klasa zawierająca statyczne metody ułatwiające lokalizowanie ImageReaders i ImageWriters oraz wykonywanie prostego kodowania i dekodowania;
  • Write – zapisuje obraz przy użyciu dowolnego ImageWritera, który obsługuje dany format. Jeśli istnieje już plik, jego zawartość jest nadpisywana.

Dodatek

Właśnie kwestia nadpisywania może być początkowo problemem. Co nam screenshocie przy cyklicznym odpalaniu testu, jak zapiszemy tylko zrzut ekranu tylko z ostatniego testu. Tutaj bardzo prostym rozwiązaniem może być dodawanie daty i godziny wykonania zrzutu ekranu. Konieczny jest import:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

Następnie trzeba stworzyć właściwy format daty:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd h-m-s a");
Date date = new Date();

W dalszej kolejności wystarczy dodać datę do zapisywanego pliku. W tym przypadku dodaliśmy go na początku, by grupować sobie zrzuty ekranu wg. daty.

ImageIO.write(screenshot.getImage(), "PNG", new File(System.getProperty("user.dir") + "/Katalog zapisu/"
      + dateFormat.format(date) + " nazwaPliku.PNG"));

Dzięki takiemu działaniu masz stworzony kod, który nie będzie nadpisywał screenów, a także w łatwy sposób będzie zapisywany i segregowany w katalogu.

Podsumowanie

Zrzut ekranu pełnej strony – Selenium  ma na celu wskazanie Ci  alternatywy dla standardowego zrzutu ekranu. Dzięki tym kilku linijkom kodu będziesz mógł korzystać z tego formatu zrzutu ekranu. Zaprezentowaliśmy też w jaki sposób unikać nadpisywania screenów.  Więcej informacji o testach automatycznych w Selenium znajdziesz tutaj.