Tests hang when running against firefox but the same tests complitly work with chromeAsk Question

问题:

I'm new in protractor and my English is bad. The situation: I have a test (actually suite of tests) wich passes against chrome, but hangs almost immediately against firefox, it hangs after clicks on a link, after it should be done expects.

Test example:

var homePageAddress = 'http://localhost';

var someLink = element(by.css('.navigationpanel-element[translate="SomeText.SomeText"]'));
var someTitle = element(by.css('.titlepanel-title-first[translate="omeText.SomeText"]'));
var someOtherLink = element(by.css('[translate="SomeText.SomeText"]'));
var someSearchBox = element(by.css('input.search-box'));
var listOfItems = element(by.css('li.list-item'));

browser.get(homePageAddress);

someLink.click();
//It hangs here in firefox
expect(someTitle.isDisplayed()).toEqual(true, 'Some result text');
expect(someOtherLink.isDisplayed()).toEqual(true, 'Some result text');
expect(someSearchBox.isDisplayed()).toEqual(true, 'Some result text');
expect(listOfItems.isPresent()).toEqual(true, 'Some result text');

conf.js:

exports.config = {
  directConnect: true,

    capabilities: {
        'browserName': 'firefox'
    },
    framework: 'jasmine2',

    specs: ['chromeOrganizationCreation.js'],

    jasmineNodeOpts: {
        defaultTimeoutInterval: 30000
    },  

   onPrepare: function() {  
        require('./waitReady.js');
   }
};

So as i said against chrome it works well but when it running against firefox it hangs after first click and even the browser window doesn't close.

Protractor log says:

A Jasmine spec timed out. Resetting the WebDriver Control Flow.
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

Increasing timeout doesn't give result, behavior the same.

A piece of selenium-server's log (end of it):

    09:49:56.693 DEBUG [20] org.apache.http.wire - http-outgoing-11 << "{"name":"clickElement","sessionId":"c9f64f66-fc8c-4f3d-a0be-535b63370dd0","status":0,"value":"ok"}"
    09:49:56.693 DEBUG [20] org.apache.http.impl.conn.DefaultManagedHttpClientConnection - http-outgoing-11: Close connection
    09:49:56.693 DEBUG [20] org.apache.http.impl.execchain.MainClientExec - Connection discarded
    09:49:56.694 DEBUG [20] org.apache.http.impl.conn.PoolingHttpClientConnectionManager - Connection released: [id: 11][route: {}->http://127.0.0.1:7055][total kept alive: 0; route allocated: 0 of 2000; total allocated: 0 of 2000]
    09:49:56.695 DEBUG [20] org.openqa.selenium.remote.RemoteWebDriver - Executed: [c9f64f66-fc8c-4f3d-a0be-535b63370dd0, clickElement {id={c0ac812d-747e-4bf9-9678-ae6025d656c1}}]
    09:49:56.695 INFO [14] org.openqa.selenium.remote.server.DriverServlet - Done: [click: 0 [[FirefoxDriver: firefox on WINDOWS (c9f64f66-fc8c-4f3d-a0be-535b63370dd0)] -> css selector: .navigationpanel-element[translate="SomeText.SomeText"]]]
    09:49:56.700 DEBUG [14] org.openqa.selenium.remote.server.DriverServlet - Finished: POST /session/e92fa9f1-8822-4f27-85a2-9f929d484e4a/element/0/click
    09:49:56.710 DEBUG [14] org.openqa.selenium.remote.server.DriverServlet - Handling: POST /session/e92fa9f1-8822-4f27-85a2-9f929d484e4a/execute_async
    09:49:56.712 INFO [14] org.openqa.selenium.remote.server.DriverServlet - Executing: [execute async script: try { return (function (rootSelector, callback) {
      var el = document.querySelector(rootSelector);

      try {
        if (window.getAngularTestability) {
          window.getAngularTestability(el).whenStable(callback);
          return;
        }
        if (!window.angular) {
          throw new Error('window.angular is undefined.  This could be either ' +
              'because this is a non-angular page or because your test involves ' +
              'client-side navigation, which can interfere with Protractor\'s ' +
              'bootstrapping.  See http://git.io/v4gXM for details');
        }
        if (angular.getTestability) {
          angular.getTestability(el).whenStable(callback);
        } else {
          if (!angular.element(el).injector()) {
            throw new Error('root element (' + rootSelector + ') has no injector.' +
               ' this may mean it is not inside ng-app.');
          }
          angular.element(el).injector().get('$browser').
              notifyWhenNoOutstandingRequests(callback);
        }
      } catch (err) {
        callback(err.message);
      }
    }).apply(this, arguments); }
    catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [body.ng-scope]])
    09:49:56.713 DEBUG [20] org.openqa.selenium.remote.RemoteWebDriver - Executing: executeAsyncScript [c9f64f66-fc8c-4f3d-a0be-535b63370dd0, executeAsyncScript {script=try { return (function (rootSelector, callback) {
      var el = document.querySelector(rootSelector);

      try {
        if (window.getAngularTestability) {
          window.getAngularTestability(el).whenStable(callback);
          return;
        }
        if (!window.angular) {
          throw new Error('window.angular is undefined.  This could be either ' +
              'because this is a non-angular page or because your test involves ' +
              'client-side navigation, which can interfere with Protractor\'s ' +
              'bootstrapping.  See http://git.io/v4gXM for details');
        }
        if (angular.getTestability) {
          angular.getTestability(el).whenStable(callback);
        } else {
          if (!angular.element(el).injector()) {
            throw new Error('root element (' + rootSelector + ') has no injector.' +
               ' this may mean it is not inside ng-app.');
          }
          angular.element(el).injector().get('$browser').
              notifyWhenNoOutstandingRequests(callback);
        }
      } catch (err) {
        callback(err.message);
      }
    }).apply(this, arguments); }
    catch(e) { throw (e instanceof Error) ? e : new Error(e); }, args=[body.ng-scope]}]
    09:49:56.714 DEBUG [20] org.apache.http.client.protocol.RequestAddCookies - CookieSpec selected: default
    09:49:56.715 DEBUG [20] org.apache.http.client.protocol.RequestAuthCache - Auth cache not set in the context
    09:49:56.715 DEBUG [20] org.apache.http.impl.conn.PoolingHttpClientConnectionManager - Connection request: [route: {}->http://127.0.0.1:7055][total kept alive: 0; route allocated: 0 of 2000; total allocated: 0 of 2000]
    09:49:56.715 DEBUG [20] org.apache.http.impl.conn.PoolingHttpClientConnectionManager - Connection leased: [id: 12][route: {}->http://127.0.0.1:7055][total kept alive: 0; route allocated: 1 of 2000; total allocated: 1 of 2000]
    09:49:56.715 DEBUG [20] org.apache.http.impl.execchain.MainClientExec - Opening connection {}->http://127.0.0.1:7055
    09:49:56.716 DEBUG [20] org.apache.http.impl.conn.DefaultHttpClientConnectionOperator - Connecting to /127.0.0.1:7055
    09:49:56.716 DEBUG [20] org.apache.http.impl.conn.DefaultHttpClientConnectionOperator - Connection established 127.0.0.1:58730<->127.0.0.1:7055
    09:49:56.717 DEBUG [20] org.apache.http.impl.conn.DefaultManagedHttpClientConnection - http-outgoing-12: set socket timeout to 10800000
    09:49:56.717 DEBUG [20] org.apache.http.impl.execchain.MainClientExec - Executing request POST /hub/session/c9f64f66-fc8c-4f3d-a0be-535b63370dd0/execute_async HTTP/1.1
    09:49:56.717 DEBUG [20] org.apache.http.impl.execchain.MainClientExec - Target auth state: UNCHALLENGED
    09:49:56.717 DEBUG [20] org.apache.http.impl.execchain.MainClientExec - Proxy auth state: UNCHALLENGED
    09:49:56.717 DEBUG [20] org.apache.http.headers - http-outgoing-12 >> POST /hub/session/c9f64f66-fc8c-4f3d-a0be-535b63370dd0/execute_async HTTP/1.1
    09:49:56.717 DEBUG [20] org.apache.http.headers - http-outgoing-12 >> Content-Type: application/json; charset=utf-8
    09:49:56.718 DEBUG [20] org.apache.http.headers - http-outgoing-12 >> Content-Length: 1172
    09:49:56.718 DEBUG [20] org.apache.http.headers - http-outgoing-12 >> Host: 127.0.0.1:7055
    09:49:56.718 DEBUG [20] org.apache.http.headers - http-outgoing-12 >> Connection: Keep-Alive
    09:49:56.718 DEBUG [20] org.apache.http.headers - http-outgoing-12 >> User-Agent: Apache-HttpClient/4.5.1 (Java/1.8.0_77)
    09:49:56.718 DEBUG [20] org.apache.http.headers - http-outgoing-12 >> Accept-Encoding: gzip,deflate
    09:49:56.718 DEBUG [20] org.apache.http.wire - http-outgoing-12 >> "POST /hub/session/c9f64f66-fc8c-4f3d-a0be-535b63370dd0/execute_async HTTP/1.1[\r][\n]"
    09:49:56.718 DEBUG [20] org.apache.http.wire - http-outgoing-12 >> "Content-Type: application/json; charset=utf-8[\r][\n]"
    09:49:56.718 DEBUG [20] org.apache.http.wire - http-outgoing-12 >> "Content-Length: 1172[\r][\n]"
    09:49:56.719 DEBUG [20] org.apache.http.wire - http-outgoing-12 >> "Host: 127.0.0.1:7055[\r][\n]"
    09:49:56.719 DEBUG [20] org.apache.http.wire - http-outgoing-12 >> "Connection: Keep-Alive[\r][\n]"
    09:49:56.719 DEBUG [20] org.apache.http.wire - http-outgoing-12 >> "User-Agent: Apache-HttpClient/4.5.1 (Java/1.8.0_77)[\r][\n]"
    09:49:56.719 DEBUG [20] org.apache.http.wire - http-outgoing-12 >> "Accept-Encoding: gzip,deflate[\r][\n]"
    09:49:56.719 DEBUG [20] org.apache.http.wire - http-outgoing-12 >> "[\r][\n]"
    09:49:56.719 DEBUG [20] org.apache.http.wire - http-outgoing-12 >> "{"script":"try { return (function (rootSelector, callback) {\n  var el = document.querySelector(rootSelector);\n\n  try {\n    if (window.getAngularTestability) {\n      window.getAngularTestability(el).whenStable(callback);\n      return;\n    }\n    if (!window.angular) {\n      throw new Error('window.angular is undefined.  This could be either ' +\n          'because this is a non-angular page or because your test involves ' +\n          'client-side navigation, which can interfere with Protractor\\'s ' +\n          'bootstrapping.  See http://git.io/v4gXM for details');\n    }\n    if (angular.getTestability) {\n      angular.getTestability(el).whenStable(callback);\n    } else {\n      if (!angular.element(el).injector()) {\n        throw new Error('root element (' + rootSelector + ') has no injector.' +\n           ' this may mean it is not inside ng-app.');\n      }\n      angular.element(el).injector().get('$browser').\n          notifyWhenNoOutstandingRequests(callback);\n    }\n  } catch (err) {\n    callback(err.message);\n  }\n}).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }","args":["body.ng-scope"]}"
    09:50:25.970 DEBUG [13] org.openqa.selenium.remote.server.DriverServlet - Handling: DELETE /session/e92fa9f1-8822-4f27-85a2-9f929d484e4a
    09:50:25.971 INFO [13] org.openqa.selenium.remote.server.DriverServlet - Executing: [delete session: e92fa9f1-8822-4f27-85a2-9f929d484e4a])

Please help, I spend a lot of time trying to resolve it, may be I should open some issue? But I'm not shure about define certain steps to reproduce it without local application.

Updated

The problem described here: https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/4757

piece of log from my firefox driver:

"level":"INFO","message":"[fxdriver.SyntheticMouse] Calling fireMouseEvent mousemove 397, 205, ","timestamp":1461003932367,"type":""} {"level":"INFO","message":"[fxdriver.SyntheticMouse] Calling fireMouseEvent mousedown 397, 205, ","timestamp":1461003932388,"type":""} {"level":"INFO","message":"[fxdriver.SyntheticMouse] Calling fireMouseEvent mouseup 397, 205, ","timestamp":1461003932408,"type":""} {"level":"INFO","message":"[fxdriver.SyntheticMouse] Calling fireMouseEvent click 397, 205, ","timestamp":1461003932454,"type":""} {"level":"INFO","message":"[fxdriver.Utils] Not loading document anymore.","timestamp":1461003932478,"type":""} {"level":"INFO","message":"[fxdriver.nsCommandProcessor] Received command: executeAsyncScript","timestamp":1461003932504,"type":""} {"level":"INFO","message":"[fxdriver.nsCommandProcessor] Received command: findElements","timestamp":1461003934754,"type":""} {"level":"INFO","message":"[fxdriver.DelayedCommand] Ignoring pending about:document-onload-blocker request","timestamp":1461003934917,"type":""} {"level":"INFO","message":"[fxdriver.DelayedCommand] Ignoring pending about:document-onload-blocker request","timestamp":1461003935029,"type":""} {"level":"INFO","message":"[fxdriver.DelayedCommand] Ignoring pending about:document-onload-blocker request","timestamp":1461003935156,"type":""} {"level":"INFO","message":"[fxdriver.DelayedCommand] Ignoring pending about:document-onload-blocker request","timestamp":1461003935279,"type":""} {"level":"INFO","message":"[fxdriver.DelayedCommand] Ignoring pending about:document-onload-blocker request","timestamp":1461003935395,"type":""} {"level":"INFO","message":"[fxdriver.DelayedCommand] Ignoring pending about:document-onload-blocker request","timestamp":1461003935518,"type":""} {"level":"INFO","message":"[fxdriver.DelayedCommand] Ignoring pending about:document-onload-blocker request","timestamp":1461003935640,"type":""} {"level":"INFO","message":"[fxdriver.DelayedCommand] Ignoring pending about:document-onload-blocker request","timestamp":1461003935757,"type":""} {"level":"INFO","message":"[fxdriver.DelayedCommand] Ignoring pending about:document-onload-blocker request","timestamp":1461003935889,"type":""} {"level":"INFO","message":"[fxdriver.DelayedCommand] Ignoring pending about:document-onload-blocker request","timestamp":1461003936015,"type":""} {"level":"INFO","message":"[fxdriver.DelayedCommand] Ignoring pending about:document-onload-blocker request","timestamp":1461003936145,"type":""} {"level":"INFO","message":"[fxdriver.DelayedCommand] Ignoring pending about:document-onload-blocker request","timestamp":1461003936273,"type":""}

But i still don't know how to resolve it, what is your comet request: To solve the problem I rebuild selenium using following guide: http://shengwangi.blogspot.com/2014/08/how-to-build-selenium-from-source.html This generated my custom version of jar file. Based on comment #28 I updated nsCommandProcessor.js and just added: (request.name.indexOf('<your comet request>') > -1) to hasOnLoadBlocker = hasOnLoadBlocker || (request.name == 'about:document-onload-blocker'); so it would ignore the comet call. nsCommandProcessor.js is under javascript\firefox-driver\js folder

回答1:


There's a few reasons this could be happening. My first suggestion would be to make sure webdriver is up to date. Type this in your console:

webdriver-manager update

Second, when you said increasing the timeout produces the same behavior, do you actually see a longer timeout? If it's pausing for 5 seconds (default), then Jasmine think's its asynchronous. http://jasmine.github.io/2.0/introduction.html#section-43

I would try (also as a good practice), separating your tests into it blocks.

it('gets the homepage', function() {
    var homePageAddress = 'http://localhost';
    browser.get(homePageAddress)
    expect(browser.getCurrentUrl()).toContain('localhost');
});

it('clicks the link', function() {
    var someLink = element(by.css('.navigationpanel-element[translate="SomeText.SomeText"]'));
    someLink.click();
    expect(something).toBe(true);
});

This way might help Protractor handle the control-flow a little better.

Third, if those don't work, maybe try another way of locating the element. I'm not too familiar with the translate attribute, but it also seems to be an 'experimental technology' and is not supported by any browser according to MDN.

https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/translate

回答2:


The problem described here: https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/4757

There is two ways to resolve it: first described in below link, second is which we used: to turn on working signalR through websokets. Thanks for the support!

标签: selenium firefox protractor
© 2014 TuiCode, Inc.