nightwatchjs / nightwatch

Integrated end-to-end testing framework written in Node.js and using W3C Webdriver API. Developed at @browserstack
https://nightwatchjs.org
MIT License
11.79k stars 1.31k forks source link

switchWindow not working on Firefox v57 + geckodriver v1.19.1 #1663

Closed nicholaswmin closed 6 years ago

nicholaswmin commented 6 years ago

switchWindow doesn't seem to work in Firefox 57. Although no errors are thrown/logged, the browser never switches focus to the passed window.

Steps to reproduce

Expected behaviour

Actual behaviour

The browser never focuses to Tab 2, even after adding an extended pause() to make sure the tab has opened and loaded.

MCVE

'use strict'

module.exports = {
  'Firefox not focusing window test case' : function (browser) {
    browser
      // Tab 1, write something in search box
      .url('https://www.google.com')
      .waitForElementVisible('body', 5000)
      .setValue('#lst-ib', 'hello world - tab 1')

      // Tab 2, write something in search box
      .execute(function () {
        window.open('https://www.google.com')
      }, [])
      .pause(2000)
      .window_handles(function(result) {
        this.switchWindow(result.value[1])
      })
      .waitForElementVisible('body', 5000)
      .setValue('#lst-ib', 'hello world - tab 2')

      .pause(20000)
      .end()
  }
}

Logs

Running the above MCVE with --verbose shows a POST 500 Error when attempting to switchWindow

INFO Request: POST /wd/hub/session/7c3873ed-1dae-3143-9124-f104f8e6ee19/window 
 - data:  {"name":{"handle":"2147483653"}} 
 - headers:  {"Content-Type":"application/json; charset=utf-8","Content-Length":32}
ERROR Response 500 POST /wd/hub/session/7c3873ed-1dae-3143-9124-f104f8e6ee19/window (5071ms) { state: 'invalid argument',
  sessionId: null,
  hCode: 1180860869,
  value: 
   { additionalInformation: '\nDriver info: driver.version: unknown',
     localizedMessage: 'Missing \'handle\' parameter\nBuild info: version: \'3.7.1\', revision: \'8a0099a\', time: \'2017-11-06T21:07:36.161Z\'\nSystem info: host: \'Nicholass-iMac.local\', ip: \'192.168.0.10\', os.name: \'Mac OS X\', os.arch: \'x86_64\', os.version: \'10.12.6\', java.version: \'1.8.0_60\'\nDriver info: driver.version: unknown',
     systemInformation: 'System info: host: \'Nicholass-iMac.local\', ip: \'192.168.0.10\', os.name: \'Mac OS X\', os.arch: \'x86_64\', os.version: \'10.12.6\', java.version: \'1.8.0_60\'',
     supportUrl: null,
     cause: null,
     suppressed: [],
     message: 'Missing \'handle\' parameter\nBuild info: version: \'3.7.1\', revision: \'8a0099a\', time: \'2017-11-06T21:07:36.161Z\'\nSystem info: host: \'Nicholass-iMac.local\', ip: \'192.168.0.10\', os.name: \'Mac OS X\', os.arch: \'x86_64\', os.version: \'10.12.6\', java.version: \'1.8.0_60\'\nDriver info: driver.version: unknown',
     hCode: 722310431,
     class: 'org.openqa.selenium.InvalidArgumentException',
     buildInformation: null },
  class: 'org.openqa.selenium.remote.Response',
  status: 61 }
LOG     → Completed command window (5095 ms)

Notes

System Configuration

Nightwatch --env configuration

"firefox" : {
  "desiredCapabilities": {
    "browserName": "firefox",
    "marionette": true
  }
}
nicholaswmin commented 6 years ago

Continuing...

I'm not a WebDriver expert in any way (this is my first time working with the stuff) but..

If you add a handle parameter instead of name when POSTing, it works.

For example:

In nightwatch protocol.js:

function postRequest(path, data, callback) {

  // @NOTE Ridiculous monkey patch just for testing
  if (data.name) {
    data = Object.assign(data, {
      handle: data.name
    })  
  }
  // End of ridiculous monkey patch

  if (arguments.length === 2 && typeof data === 'function') {
    callback = data;
    data = '';
  }

  var options = {
    path : '/session/' + Nightwatch.sessionId + path,
    method : 'POST',
    data : data || ''
  };

  return sendRequest(options, function(result) {
    if (/\/element$/.test(options.path) && result.value) {
      result.value = validateElementEntry(result.value);
    } else if (/\/elements$/.test(options.path) && Array.isArray(result.value)) {
      result.value = result.value.map(function(entry) {
        return validateElementEntry(entry);
      });
    }

    if (typeof callback === 'function') {
      callback.call(this, result);
    }
  });
}
aberonni commented 6 years ago

Having the same issue here. More or less same setup as @nicholaswmin

This is my system configuration:

I'm not sure whether the following issue could be related: https://github.com/SeleniumHQ/selenium/issues/5064

beatfactor commented 6 years ago

Please see https://github.com/nightwatchjs/nightwatch/issues/1664#issuecomment-351022981

nicholaswmin commented 6 years ago

Unless I'm missing the purpose of this project, you seem to be closing issues and jumping to conclusions rather prematurely. I'm not sure why. Opening and tracking these issues helps your project.

I've included a snippet above that illustrates how this can be fixed in this project. I can issue a PR if you want me to.

dstep commented 6 years ago

It is still an issue with

geckodriver v0.19.1 selenium-3.10.0 Firefox v59.0

meganhumphreys commented 6 years ago

Having same issue as above - Firefox can't switchWindow()

dstep commented 6 years ago

This workaround works for me:

https://github.com/dstepper/selenium/commit/2da01059bc3853f0d2a936a0bff18bd344d3aa95#diff-578329ec7273c4a024979fd0ebcda293

kiran-ghe commented 6 years ago

This is an issue in FF 62 and it is a blocker for us to be unable to extend our night watch test suite to run in FF...After investing so much time into nightwatch, I hate to see this basic functionality not compatible with one of the major browsers.

Just curious if anybody has any workarounds that work for them considering that https://github.com/dstepper/selenium/commit/2da01059bc3853f0d2a936a0bff18bd344d3aa95#diff-578329ec7273c4a024979fd0ebcda293 is not merged?

P.S. going round in circles here because @beatfactor closed this issue blaming it to be gecko specific but gecko shuttles us back to nightwatch: https://github.com/SeleniumHQ/selenium/issues/5831#issuecomment-384789011 What is next?

beatfactor commented 6 years ago

@kiran-ghe I'm sorry to hear about your frustration, but this issue should be fixed in the latest nightwatch version, v1.0.11. Could you please try upgrading?

kiran-ghe commented 6 years ago

Thanks @beatfactor we tried to use the Nightwatch version you mentioned but we can't even get the framework to launch, we get this error; it works fine in the current version 0.9.21: Error reading external global file using "./environments/index" Error: Cannot find module '/Users/michaeljk/workspace/nightwatchproject/configs/environments/index' at Function.Module._resolveFilename (module.js:527:15) at Function.Module._load (module.js:476:23) at Module.require (module.js:568:17) at require (internal/module.js:11:18)

beatfactor commented 6 years ago

@kiran-ghe would you mind sharing your nightwatch.json config?

beatfactor commented 6 years ago

@kiran-ghe please open a different ticket and include the above error and your config, if you don't mind.