The What
During Selenium test execution, i want to store a screenshot of what is displayed in the browser to understand in what conditions the test ran.
The How
Ideally you will create a screenshot capturing method that will be used across several tests. In the class where this will be created, the following classes need to be imported:
import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot;
The first one of the two will define the type of object to which the screenshot will be stored (in this example, it will be saved to a file; a base64 string can also be used). The second import will be the one that creates the screenshot. The usage of these, therefore taking a screenshot, is described below:
File filetoCopyTheScreenshot = new File(pathToFile);
File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshot, filetoCopyTheScreenshot);
In the code above, the first line creates an empty file, to which the screenshot will be copied (it must be a location on the disk, with a file type of png). This happens because Selenium creates a screenshot (at the second line of the code above), however it deletes it after the test execution finishes. Therefore, it must be stored into the blank file created initially, as per the third line of code above.
So in this case, whenever the method into which the code above is defined gets called, a screenshot is created (the pathToFile must be created for each test run, otherwise the screenshot will be stored into just one file, meaning some screenshots will get overriden; therefore, the pathToFile should be sent as a parameter to the screenshot generating method).
Aditionally – take screenshots only on failures
In general you would only need to take a screenshot if a test has failed. To do so, you should put the screenshot taking code into a listener (remember this post about custom listeners), in the onTestFailure method), and maybe in the onTestSkipped one also (to better understand why a test was skipped). Just make sure that the tests that you need to take screenshots of are running having the listener dependency set.