docs: function open(url, options, callback) {
    let pageSettings, realUrl;
  
    async.series([
  
      // Remove memory cache if exists
      next => this.__page__.clearMemoryCache(next),
  
      // Set custom request headers
      next => this.__page__.set('customHeaders', options.headers, next),
  
      // Get page settings
      next => this.__page__.get('settings', (err, settings) => {
        if (err) return next(err);
  
        pageSettings = settings;
        next();
      }),
  
      // Make request
      next => this.__page__.openUrl(
        url,
        // If specify `data` SlimerJS will always make POST request (https://github.com/laurentj/slimerjs/issues/362)
        options.method.toLowerCase() === 'get' ?
          { operation: options.method } :
          { operation: options.method, data: options.data },
        pageSettings,
        next
      ),
  
      // Wait loading
      next => this.__pageWait__(null, null, next),
  
      // Reset custom headers back
      next => this.__page__.set('customHeaders', {}, next),
  
      // Get real url (may change after redirect)
      next => this.__page__.get('url', (err, url) => {
        if (err) return next(err);
  
        realUrl = url;
        next();
      }),
  
      // Get response
      next => this.__engine__.get('__responses__', (err, responses) => {
        if (err) return callback(err);
  
        // Find last actual
        // Can be empty on error
        this.__response__ = _.findLast(responses, resp => resp.url === realUrl) || {};
  
        // Save response data in tab info
        this.__tabs__[this.__tabIndex__].response = this.__response__;
        next();
      })
    ], err => {
      if (err) return callback(err);
  
      // If is not html page - finish here
      if ((this.__response__.contentType || '').indexOf('text/html') === -1) {
        callback();
        return;
      }
  
      // Inject client scripts from options after load
      async.eachSeries(this.__options__.inject, (scriptPath, next) => {
        this.__page__.injectJs(scriptPath, next);
      }, callback);
    });
  }