...

/

Miscellaneous Techniques

Miscellaneous Techniques

Explore more about Selenium debugging by learning advanced techniques.

Take a screenshot

Another way of debugging is to take a screenshot of the current browser window when an error/failure occurs. Selenium supports this in a very easy way:

var fs = require('fs');    
driver.takeScreenshot().then(function(data) {
  // Base64 encoded png
  fs.writeFileSync(__dirname + "/tmp/screenshot1.png", data, 'base64');      
});

However, there is one problem with the above script. When the above script runs for the second time, it will return an error The file already exists. So, a simple workaround is to write a file with the timestamped file name as:

Press + to interact
// save to timestamped file, e.g. screenshot-12070944.png
Date.prototype.yyyymmdd = function() {
var mm = this.getMonth() + 1; // getMonth() is zero-based
var dd = this.getDate();
return [this.getFullYear(), !mm[1] && '0', mm, !dd[1] && '0', dd].join('');
};
function writeScreenshot(data) {
name = new Date().yyyymmdd() + ".png";
var screenshotPath = __dirname + "/tmp/";
var fs = require('fs');
fs.writeFileSync(screenshotPath + name, data, 'base64');
};
test.it("Take screenshot saved to timestamped file", function() {
driver.takeScreenshot().then(function(data) {
writeScreenshot(data);
});
});

Testing the recipe

Practice the screenshot code given in the recipe above. To execute the example test script, click the Run button.


var assert = require('assert');
var webdriver = require('selenium-webdriver'),
              By = webdriver.By,
              until = webdriver.until;
var test = require('selenium-webdriver/testing');  
var driver;
const timeOut = 15000;            



const chromeCapabilities = webdriver.Capabilities.chrome();
chromeCapabilities.set('chromeOptions', {args: ['--headless', '--disable-gpu','--no-sandbox','--disable-dev-shm-usage']});




var site_root_url = "file://" + __dirname + "/../../site"

String.prototype.contains = function(it) { return this.indexOf(it) != -1; };

test.describe('Debug', function() {

  test.before(function() {
    this.timeout(timeOut);
      driver = new webdriver.Builder()
      .forBrowser('chrome')
      .withCapabilities(chromeCapabilities)
      .build();
  });
  
  test.after(function() {
    driver.quit();
  });

  test.beforeEach(function() {
    // runs before each test in this block
    this.timeout(timeOut);
    driver.get("file://" + __dirname + "/../../site/assert.html");
  });

  // test cases

  var url = "";


	

  test.it("Take screenshot", function() {
		// this won't save to file, as Take screenshot returns a promise 
		// driver.takeScreenshot(__dirname + "/tmp/screenshot1.png");
	
		var fs = require('fs');		
		driver.takeScreenshot().then(function(data) {
			// Base64 encoded png
			fs.writeFileSync(__dirname + "/tmp/screenshot1.png", data, 'base64');		  
		});
		
		
	});
	
	Date.prototype.yyyymmdd = function() {
	  var mm = this.getMonth() + 1; // getMonth() is zero-based
	  var dd = this.getDate();

	  return [this.getFullYear(), !mm[1] && '0', mm, !dd[1] && '0', dd].join(''); // padding
	};
	
	function writeScreenshot(data) {
	  name = new Date().yyyymmdd() + ".png";
	  var screenshotPath = __dirname + "/tmp/";	
		var fs = require('fs');			
	  fs.writeFileSync(screenshotPath + name, data, 'base64');
	};
	
	test.it("Take screenshot saved to timestamped file", function() {
		driver.takeScreenshot().then(function(data) {
			writeScreenshot(data);
		});
  });


});
Practice recipe for taking a time-stamped screenshot using Selenium

Leave browser open after test finishes

Whenever an error or a failure occurs during the test execution, ...