如何等待 WEBdriver.io 的 Ajax 调用完成

Posted

技术标签:

【中文标题】如何等待 WEBdriver.io 的 Ajax 调用完成【英文标题】:How to Wait for Ajax calls to complete for WEbdriver.io 【发布时间】:2018-06-09 14:12:26 【问题描述】:

我试图弄清楚如何让 webdriver.io 在单击按钮后等待所有 ajax 请求完成。

不幸的是,document.readyState 始终为 = 'complete' ,除了其中包含一些稍微不同的数据之外,该网页没有任何“独特性”。

有没有其他方法可以测试页面中的javascript函数是否完整..?

    await this.browser.waitUntil(function () 
        return this.execute(function () 
            if (document.readyState === 'complete')
                return true;
        )
    );

【问题讨论】:

这可能对你有帮助npmjs.com/package/webdriverajax 与其等待所有/某些请求,不如等待特定请求完成。您可以使用webdriver.io/docs/api/browser/mock.html 监视特定请求,然后等待它被请求webdriver.io/docs/api/expect-webdriverio.html#toberequested @MikeG。通常我们不太关心被请求的 API,而是等待它完成,无论状态如何。使用您的建议,我仍然不知道如何实现这一目标 @SergeyPleshakov 你能澄清你的问题吗?你到底想达到什么目的? 所以所有请求都经过几个步骤 - 发起,可能被重定向,但最终完成(实际术语可能不同)。我如何阅读这个问题是,用户想要等到请求完成,您建议在它刚刚启动时等待。我理解对了吗@MikeG。 【参考方案1】:

在 WDIO 5.x 及更高版本中,引入了一个名为“拦截服务”的新第三方插件来帮助解决此问题。

您需要将服务包wdio-intercept-service 安装为开发依赖项,并在wdio.config.js 中将其声明为services: ['intercept']

您可以设置拦截器来捕获 xhr 请求,如下所示。

browser.setupInterceptor();  // start capturing xhr requests

拦截器设置好后,你可以声明一些关于请求的期望,并使用它们的索引(期望的声明顺序)获取这些请求。

browser.expectRequest('GET', '/api/foo', 200); // expect GET request to /api/foo with 200 statusCode
var request = browser.getRequest(0);
assert.equal(request.method, 'GET');
assert.equal(request.response.headers['content-length'], '42');

您可以在他们的 Github 页面上找到更多信息:Intercept Service

【讨论】:

并没有真正回答这个问题,而是为实验实现所需行为提供了基础

以上是关于如何等待 WEBdriver.io 的 Ajax 调用完成的主要内容,如果未能解决你的问题,请参考以下文章

如何同步运行webdriver.io?

Webdriver.io - 如何在配置中使用 beforeEach 钩子

如何在 webdriver.io 中以 32 位模式启动 IE

如何使用 webdriver.io 控制 Android 设备

如何使用没有标识符的 WebDriver.io 在页面上查找元素

如何使用 webdriver.io 模拟 ctrl-click 或 shift-click?