使用 appium 执行量角器脚本时等待异步脚本结果超时

Posted

技术标签:

【中文标题】使用 appium 执行量角器脚本时等待异步脚本结果超时【英文标题】:Timed out waiting for asynchronous script result while executing protractor scripts with appium 【发布时间】:2016-09-01 10:14:36 【问题描述】:

在量角器中运行多个测试时遇到问题:60010 秒后等待异步脚本结果超时 登录脚本后执行的教程脚本代码:

这是我在A Code proposed in another question 的配置文件中使用的代码,但它没有解决我的问题!

onPrepare: function() 
  return browser.getProcessedConfig().then(function(config) 
    var browserName = config.capabilities.browserName;
    browser.manage().timeouts().setScriptTimeout(60000);

  );

PS:即使我为元素放置了不正确的位置,我也会出现超时错误,而不是找不到该元素!就好像那行代码“点击进入教程按钮”从未执行过

是因为教程进行了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">&nbsp;</a></li><li><a href="javascript:void(0);" data-stepnumber="2">&nbsp;</a></li><li><a href="javascript:void(0);" data-stepnumber="3">&nbsp;</a></li><li><a href="javascript:void(0);" data-stepnumber="4">&nbsp;</a></li><li><a href="javascript:void(0);" data-stepnumber="5">&nbsp;</a></li><li><a href="javascript:void(0);" data-stepnumber="6">&nbsp;</a></li><li><a href="javascript:void(0);" data-stepnumber="7">&nbsp;</a></li><li><a href="javascript:void(0);" data-stepnumber="8">&nbsp;</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>​

【问题讨论】:

是的,这是一个有角度的网站 如果是这种情况,理想的解决方案是询问他们是否可以将该服务切换为使用 Interval.js(Angular 的一部分)。否则,您必须打开 browser.ignoreSynchronization 并将您的应用视为无角度的 @Emma 嗨,我在您的评论中发现了这个问题。所以我会尽力提供帮助。 --- 首先将element(by.buttonText('Next')) 更改为$('.introjs-nextbutton') --- 第二个EC.stalenessOf... 看起来您正在等待按钮未附加到DOM 然后单击它...这对我来说没有任何意义.尝试删除EC.stalenessOf,然后简单地执行tutorial.click()。试试这些建议并告诉我它是否有效;) @LinhPham,嗨,好的,谢谢,我会试着告诉你;) @Emma,你能在调整后以某种方式分享该描述块的完整代码吗? 【参考方案1】:

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.jstutorial-spec.js。在 afterAll() 块中添加 process.nextTick(done); 以确保在规范之后没有任何 Jasmine Reporters 被卡住。

describe('foo', function()

  afterAll(function(done)
    process.nextTick(done);
  );  

  it('should bar...', function() );

P.S. 请注意,我完全不知道我的建议/方法是否有帮助。由于使用 e2e-test 进行调试总是很痛苦......因为我们总是可能不知道“错误来自哪里”。所以我能做的就是给你建议。 (有时我花了几个小时来观察浏览器的行为来识别 e2e-test 的问题)

并且请勿将我的代码复制粘贴到您的代码中。我用你提供的图片打出来的,我可以在那里打一些错字。

【讨论】:

感谢您的建议,我会尽力让您知道;) @Emma,我添加了第三条建议。如果错误仍然存​​在,请将其复制并粘贴到此处。明天我会再次检查这个,加油! ;) 好的,我会检查它,因为直到现在错误仍然存​​在。非常感谢您的所有尝试;) @Emma,我们是否仍然有相同的错误输出? @Emma,非常有用的信息,我有 2 个问题 --- 关于 browser.sleep(time_to_wait);,你能数一下登录后多久出现超时错误吗? --- 请尝试手动登录并使用时钟检查完成登录需要多长时间(路线+视图已更改和更新)【参考方案2】:

在capabilities下为conf.js添加参数:

maxSessions: 1,

应该会有所帮助。 另外你的 timeoutinterval 可能太高了 30000 应该足够了。

或者在准备换行时:

browser.manage().timeouts().implicitlyWait(5000);

@编辑: 改成类似这样的东西发现了这样的东西

    baseUrl 是 10.0.2.2 而不是 localhost 因为它是用来访问 android 中宿主机的 localhost 模拟器/设备
baseUrl: 'http://10.0.2.2:' + (process.env.HTTP_PORT || '8000'),

功能新命令:

 newCommandTimeout: 60

另外,使用承诺代替超时可能会有所帮助

someethingToDo.click().then(function()

  return somethingToDo.click();

).then(function()
    //morecode
);

【讨论】:

第一个答案同样的错误!我会尝试第二个;) 很抱歉,即使使用第二个选项,我仍然遇到同样的问题!对于登录,点击选项已经完成,它在主页上根本不起作用 我有一个问题。您正在使用量角器或某种 pytractor 或 protractor.net 吗?我在使用 PyTractor 时遇到了类似的问题,我不得不将其更改为干净的 ProTractor。 我正在使用量角器在移动设备(ipad 模拟器)中测试网站 我编辑主​​要答案检查它,它会起作用:),然后告诉我你的主页是否可以在移动设备上显示?【参考方案3】:

我认为您可能对如何设置超时有疑问。从您的配置文件中删除所有超时引用并尝试这样的操作(根据需要进行相应调整以包含其他配置):

exports.config = 
    allScriptsTimeout: 60000,
    getPageTimeout: 30000,
    jasmineNodeOpts: 
        defaultTimeoutInterval: 62000,
    

【讨论】:

我试过了,但我还有一朵茉莉花DEFAULT_TIMEOUT_INTERVAL【参考方案4】:

最后我尝试通过添加这个回调来解决我的问题

describe("long asynchronous specs", function() 
    beforeEach(function(done) 
      done();
    , 10000);
    );

这是来自 jasmine Asynchronous_Support 的链接,可帮助我了解超时问题。 希望对你有帮助,

【讨论】:

以上是关于使用 appium 执行量角器脚本时等待异步脚本结果超时的主要内容,如果未能解决你的问题,请参考以下文章

Click() 函数在量角器脚本中不起作用

等待 Protractor 与页面同步时出错:在 Protractor IE11 执行中

量角器 - 等待异步完成

2018-09-21显示等待、隐式等待和强制等待的区别

量角器异步/等待 UnhandledPromiseRejectionWarning:未处理的承诺拒绝

HTML5 脚本标签,延迟等待任何以前的异步脚本