5.10.1
3.2.2
firefox v. 45.0.2
Windows 8.1 x64
我是量角器的新手,我的英语很糟糕。 情况: 我有一个测试(实际上是测试套件),它通过了对抗chrome,但几乎立即挂起来反对firefox,它点击链接后挂起,应该完成预期。
测试示例:
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');
}
};
正如我对Chrome所说的那样效果很好但是当它针对firefox运行时,它会在第一次点击后挂起,甚至浏览器窗口也不会关闭。
量角器日志说:
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.
增加超时不会导致结果,行为相同。
一段selenium-server的日志(结尾):
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])
请帮忙,我花了很多时间试图解决它,可能是我应该开一些问题?但是,如果没有本地应用,我就不会定义某些步骤来重现它。
更新
此处描述的问题: https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/4757
来自我的firefox驱动程序的日志:
"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":""}
但我仍然不知道如何解决它,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
答案 0 :(得分:1)
出现这种情况的原因有几个。我的第一个建议是确保webdriver是最新的。在控制台中输入:
webdriver-manager update
其次,当你说增加超时产生相同的行为时,你真的看到更长的超时吗?如果它暂停5秒(默认),那么Jasmine认为它是异步的。 http://jasmine.github.io/2.0/introduction.html#section-43
我会尝试(也是一种很好的做法),将您的测试分成it
块。
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);
});
这种方式可能有助于Protractor更好地处理控制流。
第三,如果那些不起作用,也许可以尝试另一种方法来定位元素。我对translate
属性不太熟悉,但它似乎也是一种实验性技术&#39;根据MDN,任何浏览器都不支持。
https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/translate
答案 1 :(得分:1)
此处描述的问题:https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/4757
有两种方法可以解决它:首先在下面的链接中描述, 第二个是我们使用的:通过websokets打开工作信号R. 感谢您的支持!