使用 appium 执行量角器脚本时等待异步脚本结果超时
Timed out waiting for asynchronous script result while executing protractor scripts with appium
我在 运行 量角器中进行多个测试时遇到问题:60010 秒后等待异步脚本结果超时
在登录脚本之后执行的教程脚本代码:
这里是我在 配置文件中使用的代码,但它没有解决我的问题!
onPrepare: function() {
return browser.getProcessedConfig().then(function(config) {
var browserName = config.capabilities.browserName;
browser.manage().timeouts().setScriptTimeout(60000);
});
PS:即使我为元素放置了错误的位置,我也会出现超时错误,而不是找不到该元素!好像那行代码 "the click into tutorial button" 从未执行过
- 是否因为教程进行了 ajax 调用?
这是我的 html 代码:
</div></md-card-content> </md-card><!-- end ngIf: !expandChart --> </div> </div> </div></md-content> </div></div> <!-- Google Analytics: change UA-XXXXX-X to be your site's ID --> <!--<script>--> <!--!function(A,n,g,u,l,a,r){A.GoogleAnalyticsObject=l,A[l]=A[l]||function(){--> <!--(A[l].q=A[l].q||[]).push(arguments)},A[l].l=+new Date,a=n.createElement(g),--> <!--r=n.getElementsByTagName(g)[0],a.src=u,r.parentNode.insertBefore(a,r)--> <!--}(window,document,'script','https://www.google-analytics.com/analytics.js','ga');--> <!--ga('create', 'UA-XXXXX-X');--> <!--ga('send', 'pageview');--> <!--</script>--> <script src="scripts/vendor.js"></script> <script src="cordova.js"></script> <script src="scripts/scripts.js"></script> <script src="https://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha1.js"></script> <script src="https://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha256.js"></script> <script src="https://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/enc-base64-min.js"></script> <div class="introjs-overlay" style="top: 0;bottom: 0; left: 0;right: 0;position: fixed;opacity: 0.8;"></div><div class="introjs-helperLayer " style="width: 538px; height:366px; top:64px;left: 195px;"></div><div class="introjs-tooltipReferenceLayer" style="width: 538px; height:366px; top:64px;left: 195px;"><div class="introjs-tooltip" style="left: 546px;"><div class="introjs-tooltiptext">Watchlist view. Swipe the row in the grid to the left to show the delete action.</div><div class="introjs-bullets"><ul><li><a class="active" href="javascript:void(0);" data-stepnumber="1"> </a></li><li><a href="javascript:void(0);" data-stepnumber="2"> </a></li><li><a href="javascript:void(0);" data-stepnumber="3"> </a></li><li><a href="javascript:void(0);" data-stepnumber="4"> </a></li><li><a href="javascript:void(0);" data-stepnumber="5"> </a></li><li><a href="javascript:void(0);" data-stepnumber="6"> </a></li><li><a href="javascript:void(0);" data-stepnumber="7"> </a></li><li><a href="javascript:void(0);" data-stepnumber="8"> </a></li></ul></div><div class="introjs-progress" style="display: none;"><div class="introjs-progressbar" style="width:12.5%;"></div></div><div class="introjs-arrow left" style="display: inherit;"></div><div class="introjs-tooltipbuttons"><a class="introjs-button introjs-skipbutton" href="javascript:void(0);">Don't show it again!</a><a href="javascript:void(0);" class="introjs-button introjs-prevbutton introjs-disabled" tabindex="-1">Previous</a><a href="javascript:void(0);" class="introjs-button introjs-nextbutton">Next</a></div></div></div></body></html>
将参数添加到 conf.js 下的功能:
maxSessions: 1,
应该有帮助。
此外,您的超时间隔可能太高,30000 应该足够了。
或准备将行更改为:
browser.manage().timeouts().implicitlyWait(5000);
@编辑:
更改为与此类似的东西,发现类似这样的东西
- baseUrl is 10.0.2.2 instead of localhost because it is used to access the localhost of the host machine in the android
emulator/device
baseUrl: 'http://10.0.2.2:' + (process.env.HTTP_PORT || '8000'),
能力新命令:
newCommandTimeout: 60
使用 promises 代替超时可能会有帮助
someethingToDo.click().then(function(){
return somethingToDo.click();
}).then(function(){
//morecode
});
1.关于路由检查
万一在第一个规范之后,用户登录并且路线改变了。确保在执行任何测试之前导航所有内容。
expect(browser.getCurrentUrl()).toContain('#/the_route_of_logged_in');
// '#/' is just illustration. You can remove it to make it shorter
// => like this ...toContain('the_route_of_logged_in');
2。关于点击教程
browser.wait(EC.elementToBeClickable(tutorial), 10000);
在尝试单击按钮之前,使用 EC 为可单击按钮执行 browser.wait
(看来您的方法不错)
=> 总结 你可以试试这个:
'user strict';
var EC = protractor.ExpectedConditions;
describe('tutorials', function () {
it('should make click into tutorial button', function () {
expect(browser.getCurrentUrl()).toContain('the_route_of_logged_in');
var tutorial = $('.introjs-nextbutton');
browser.wait(EC.elementToBeClickable(tutorial), 8000, 'Timed out');
tutorial.click();
browser.sleep(8080); // regardless we are not reaching this point. But I will suggest to reduce this sleep time like 1000 (1s).
});
});
3。 (可选)如果以上 2 点没有帮助
在你所有的规格 login-spec.js
和 tutorial-spec.js
中。在 afterAll()
块中添加 process.nextTick(done);
以确保没有任何 Jasmine Reporters 在规范后被卡住。
describe('foo', function(){
afterAll(function(done){
process.nextTick(done);
});
it('should bar...', function() {});
}
P.S. 请注意,我完全不知道我的 suggestions/approach 是否可以提供帮助。由于使用 e2e-test 进行调试总是很痛苦……因为我们总是很可能不知道 "where are the errors come from"。所以我能做的就是给你建议。
(有时我花了几个小时来观察浏览器的行为来识别 e2e-test 的问题)
并且请勿将我的代码复制粘贴到您的代码中。我用你提供的图片打的,我可以在那里打一些错别字。
我认为您的超时设置方式可能有问题。从您的配置文件中删除所有超时引用并尝试这样的事情(根据需要进行相应调整以包括其他配置):
exports.config = {
allScriptsTimeout: 60000,
getPageTimeout: 30000,
jasmineNodeOpts: {
defaultTimeoutInterval: 62000,
}
}
最后我试图通过添加这个回调来解决我的问题
describe("long asynchronous specs", function() {
beforeEach(function(done) {
done();
}, 10000);
});
这是来自 jasmine Asynchronous_Support 的 link 帮助我理解超时问题。
希望能帮到你,
我在 运行 量角器中进行多个测试时遇到问题:60010 秒后等待异步脚本结果超时
在登录脚本之后执行的教程脚本代码:
这里是我在
onPrepare: function() {
return browser.getProcessedConfig().then(function(config) {
var browserName = config.capabilities.browserName;
browser.manage().timeouts().setScriptTimeout(60000);
});
PS:即使我为元素放置了错误的位置,我也会出现超时错误,而不是找不到该元素!好像那行代码 "the click into tutorial button" 从未执行过
- 是否因为教程进行了 ajax 调用?
</div></md-card-content> </md-card><!-- end ngIf: !expandChart --> </div> </div> </div></md-content> </div></div> <!-- Google Analytics: change UA-XXXXX-X to be your site's ID --> <!--<script>--> <!--!function(A,n,g,u,l,a,r){A.GoogleAnalyticsObject=l,A[l]=A[l]||function(){--> <!--(A[l].q=A[l].q||[]).push(arguments)},A[l].l=+new Date,a=n.createElement(g),--> <!--r=n.getElementsByTagName(g)[0],a.src=u,r.parentNode.insertBefore(a,r)--> <!--}(window,document,'script','https://www.google-analytics.com/analytics.js','ga');--> <!--ga('create', 'UA-XXXXX-X');--> <!--ga('send', 'pageview');--> <!--</script>--> <script src="scripts/vendor.js"></script> <script src="cordova.js"></script> <script src="scripts/scripts.js"></script> <script src="https://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha1.js"></script> <script src="https://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha256.js"></script> <script src="https://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/enc-base64-min.js"></script> <div class="introjs-overlay" style="top: 0;bottom: 0; left: 0;right: 0;position: fixed;opacity: 0.8;"></div><div class="introjs-helperLayer " style="width: 538px; height:366px; top:64px;left: 195px;"></div><div class="introjs-tooltipReferenceLayer" style="width: 538px; height:366px; top:64px;left: 195px;"><div class="introjs-tooltip" style="left: 546px;"><div class="introjs-tooltiptext">Watchlist view. Swipe the row in the grid to the left to show the delete action.</div><div class="introjs-bullets"><ul><li><a class="active" href="javascript:void(0);" data-stepnumber="1"> </a></li><li><a href="javascript:void(0);" data-stepnumber="2"> </a></li><li><a href="javascript:void(0);" data-stepnumber="3"> </a></li><li><a href="javascript:void(0);" data-stepnumber="4"> </a></li><li><a href="javascript:void(0);" data-stepnumber="5"> </a></li><li><a href="javascript:void(0);" data-stepnumber="6"> </a></li><li><a href="javascript:void(0);" data-stepnumber="7"> </a></li><li><a href="javascript:void(0);" data-stepnumber="8"> </a></li></ul></div><div class="introjs-progress" style="display: none;"><div class="introjs-progressbar" style="width:12.5%;"></div></div><div class="introjs-arrow left" style="display: inherit;"></div><div class="introjs-tooltipbuttons"><a class="introjs-button introjs-skipbutton" href="javascript:void(0);">Don't show it again!</a><a href="javascript:void(0);" class="introjs-button introjs-prevbutton introjs-disabled" tabindex="-1">Previous</a><a href="javascript:void(0);" class="introjs-button introjs-nextbutton">Next</a></div></div></div></body></html>
将参数添加到 conf.js 下的功能:
maxSessions: 1,
应该有帮助。 此外,您的超时间隔可能太高,30000 应该足够了。
或准备将行更改为:
browser.manage().timeouts().implicitlyWait(5000);
@编辑: 更改为与此类似的东西,发现类似这样的东西
- baseUrl is 10.0.2.2 instead of localhost because it is used to access the localhost of the host machine in the android emulator/device
baseUrl: 'http://10.0.2.2:' + (process.env.HTTP_PORT || '8000'),
能力新命令:
newCommandTimeout: 60
使用 promises 代替超时可能会有帮助
someethingToDo.click().then(function(){
return somethingToDo.click();
}).then(function(){
//morecode
});
1.关于路由检查
万一在第一个规范之后,用户登录并且路线改变了。确保在执行任何测试之前导航所有内容。
expect(browser.getCurrentUrl()).toContain('#/the_route_of_logged_in');
// '#/' is just illustration. You can remove it to make it shorter
// => like this ...toContain('the_route_of_logged_in');
2。关于点击教程
browser.wait(EC.elementToBeClickable(tutorial), 10000);
在尝试单击按钮之前,使用 EC 为可单击按钮执行 browser.wait
(看来您的方法不错)
=> 总结 你可以试试这个:
'user strict';
var EC = protractor.ExpectedConditions;
describe('tutorials', function () {
it('should make click into tutorial button', function () {
expect(browser.getCurrentUrl()).toContain('the_route_of_logged_in');
var tutorial = $('.introjs-nextbutton');
browser.wait(EC.elementToBeClickable(tutorial), 8000, 'Timed out');
tutorial.click();
browser.sleep(8080); // regardless we are not reaching this point. But I will suggest to reduce this sleep time like 1000 (1s).
});
});
3。 (可选)如果以上 2 点没有帮助
在你所有的规格 login-spec.js
和 tutorial-spec.js
中。在 afterAll()
块中添加 process.nextTick(done);
以确保没有任何 Jasmine Reporters 在规范后被卡住。
describe('foo', function(){
afterAll(function(done){
process.nextTick(done);
});
it('should bar...', function() {});
}
P.S. 请注意,我完全不知道我的 suggestions/approach 是否可以提供帮助。由于使用 e2e-test 进行调试总是很痛苦……因为我们总是很可能不知道 "where are the errors come from"。所以我能做的就是给你建议。 (有时我花了几个小时来观察浏览器的行为来识别 e2e-test 的问题)
并且请勿将我的代码复制粘贴到您的代码中。我用你提供的图片打的,我可以在那里打一些错别字。
我认为您的超时设置方式可能有问题。从您的配置文件中删除所有超时引用并尝试这样的事情(根据需要进行相应调整以包括其他配置):
exports.config = {
allScriptsTimeout: 60000,
getPageTimeout: 30000,
jasmineNodeOpts: {
defaultTimeoutInterval: 62000,
}
}
最后我试图通过添加这个回调来解决我的问题
describe("long asynchronous specs", function() {
beforeEach(function(done) {
done();
}, 10000);
});
这是来自 jasmine Asynchronous_Support 的 link 帮助我理解超时问题。 希望能帮到你,