Skip to content
This repository was archived by the owner on Jul 29, 2024. It is now read-only.

When using ExpectedConditions after browser.restart(), getting "Driver does not have valid session ID" error #3881

Closed
heathkit opened this issue Dec 27, 2016 · 11 comments

Comments

@heathkit
Copy link
Contributor

From azachar (copied from #3677)

Hi There,
I am getting a very similar issue still on the version 4.0.13, it happens sometimes...

the test opens the page and waits to have a certain part in the url using the function bellow, the tests are using browser.restart() in afterEach. Since I am using a random order of running, it happens only sometimes.

  this.waitForUrl = function(url, timeout) {
    timeout = timeout || DEFAULT_WAIT_FOR_TIMEOUT;
    return this.browser.wait(EC.urlContains(url), timeout, 'waiting url to contains ' + url);
  };

I am getting this error:

Failed: This driver instance does not have a valid session ID (did you call WebDriver.quit()?) and may no longer be used.
NoSuchSessionError: This driver instance does not have a valid session ID (did you call WebDriver.quit()?) and may no longer be used.
    at WebDriverError (/home/ubuntu/xxx/node_modules/selenium-webdriver/lib/error.js:27:5)
    at NoSuchSessionError (/home/ubuntu/xxx/node_modules/selenium-webdriver/lib/error.js:170:5)
    at checkHasNotQuit (/home/ubuntu/xxx/node_modules/selenium-webdriver/lib/webdriver.js:395:15)
    at Driver.schedule (/home/ubuntu/xxx/node_modules/selenium-webdriver/lib/webdriver.js:356:5)x
    at Driver.getCurrentUrl (/home/ubuntu/xxx/node_modules/selenium-webdriver/lib/webdriver.js:804:17)
    at /home/ubuntu/xxx/node_modules/protractor/built/expectedConditions.js:306:41

The screenshot from this failure clearly shows that the page is fully loaded and has its content so I guess this might be a bug. I guess that is related to this issue too.

Anyway, thank you for your help.

Best regards,
Andrej

Here is the failing test case:

describe('This driver instance does not have a valid session ID', function() {
  var EC = protractor.ExpectedConditions;

  function waitForUrl(url) {
    browser.wait(EC.urlContains(url), 5000).then(function() {
      console.log(url + ' found');
    })
  }

  it('Browser wait for url fails', function() {
    browser.get("https://angularjs.org/");
    waitForUrl('angular');

    browser.restart();

    browser.get("https://angularjs.org/");
    //fails here // This driver instance does not have a valid session ID (did you call WebDriver.quit()?) and may no longer be used.
    waitForUrl('angular');
  });

  it('Browser ignoreSynchronization fails', function() {
    browser.get("https://angularjs.org/");
    browser.restart();
    browser.get("https://angularjs.org/");

    browser.ignoreSynchronization = true;
    browser.get("https://github.com/");
    waitForUrl('github'); //fails here This driver instance does not have a valid session ID (did you call WebDriver.quit()?) and may no longer be used.

    browser.ignoreSynchronization = false;

    browser.restart();

    browser.get("https://angularjs.org/");
    waitForUrl('angular');
  });

});

here is protractor.conf

{ 
  rootElement: 'html', //it fails also with [ng-app]
  allScriptsTimeout: 110000,
  baseUrl: 'http://localhost:9000',
  chromeOnly: true,
  directConnect: true,
  exclude: [],
  capabilities: { browserName: 'chrome' },
  framework: 'jasmine',
  jasmineNodeOpts: { defaultTimeoutInterval: 15000, random: false },
  specs: [ 'e2e/**/*.spec.*.js', 'e2e/**/*.spec.js' ] 
}
@sjelin
Copy link
Contributor

sjelin commented Dec 27, 2016

The issue is that you shouldn't be saving a reference to ExpectedConditions as in

  var EC = protractor.ExpectedConditions;

If you set EC again after each restart call, that will fix your problem. But to be sure this is confusing. I made #3884 to document a possible solution

@sjelin sjelin closed this as completed Dec 27, 2016
@cnishina
Copy link
Member

Agree. EC has a reference back to the browser object. If the browser object goes away, the EC is no longer valid after the session quits.

A work around, for now, would be to get the ExpectedConditions from the browser object:

  function waitForUrl(url) {
   var EC = browser.ExpectedConditions;
    browser.wait(EC.urlContains(url), 5000).then(function() {
      console.log(url + ' found');
    })
  }

@heathkit
Copy link
Contributor Author

Does it make sense to have protractor.ExpectedConditions if people can run into this problem? Should we just make browser.ExpectedConditions the only official way to create ExpectedConditions?

@cnishina
Copy link
Member

^^^ Maybe we could make this as a breaking change in beta since ExpectedConditions is no longer static. @juliemr thoughts?

@azachar
Copy link

azachar commented Dec 30, 2016

Thanks a lot for your investigation, perhaps this will resolve some issues I had to comment out. I am using chat a like app to test, so I do have many browser instances... I will come back to you if this helped.

@mustafa-turab-ali
Copy link

Is this Fixed?

@schwarcu
Copy link

schwarcu commented Sep 4, 2017

Problem still occurs. I need to restart browser between 2 specific test cases and I'm not able to due to this issue. After restart page loads but error appears: -

Failed: This driver instance does not have a valid session ID (did you call WebDriver.quit()?) and may no longer be used.

@wieta
Copy link

wieta commented Sep 13, 2017

Hi, i have same problem with 'restartBrowserBetweenTests' parameter and 'browser.restart()'. I check selenium logs and i have test cases + 1 selenium session. And of course "This driver instance does not have a valid session ID (did you call WebDriver.quit()?) and may no longer be used."

@schwarcu
Copy link

schwarcu commented Sep 28, 2017

@wieta after some study I came to the source of issue which I think is common for most of users.
If you are using page object pattern and you initialize and define objects in the "desc" segment, or even in bigger scope these objects will always refer to the first browser instance.

To solve the issue, you must decache them (https://www.npmjs.com/package/decache) and then use "require" again and also agian initialize and define variables.

For my project I created a common utility function which always returns new Page Object. After I restart the browser I use my function to re-load all Page Objects and now it works perfect.

objects

So your code logic should go like this:

  1. Import Page objects module, execute some test cases
  2. Restart browser.
  3. Decache all Page object modules
  4. Import Page object modules again so all references to the browser are pointing to the new instance

My common utility function does steps 3 and 4.

Bare in mind to split data from PO files. If you want to pass data from one spec to another, create a module which does only that task, So you don't have to decache it too.

@ash-lionell
Copy link

ash-lionell commented Jan 25, 2018

Hi there!

I am facing a similar issue, when using browser.restart. In my case, a subsequent browser.wait call waits almost indefinitely, and times out after an obscene amount of time, although the page is loaded and visible the whole time.

I perform the restart operation in the Before hook of Cucumber:

Before(function(scenario) { let currFeatureName=scenario.sourceLocation.uri; console.log('feature : ',currFeatureName); if(featureName===null) featureName=currFeatureName; else if(currFeatureName!==featureName) return browser.restart(); });

Followed by a Given, where I perform a browser.get, followed by a browser.wait, before interacting with my element:

Given(/^user is logged in SNAPP$/,function(){ console.log('started : '); browser.ignoreSynchronization = true; browser.driver.get(browser.params.logon.url); browser.wait(until.visibilityOf(element(by.id('logonDialogLbl'))),1000,'waiting to load url'); logonpage.logon(); browser.sleep(2000);

It is seemingly getting stuck in the browser.wait call, and times out, after waiting for an enormous amount of time.

@arjunUnniumbath
Copy link

same issue as mentioned above.

I am facing a similar issue, when using browser.restart. In my case, a subsequent browser.wait call waits almost indefinitely, and times out after an obscene amount of time, although the page is loaded and visible the whole time.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

9 participants