是否可以通过量角器以任何方式读取服务状态?

时间:2019-06-05 13:43:33

标签: javascript node.js service protractor

当我们运行任何Web应用程序时,应用程序都会在内部调用Web服务,以任何方式我们都可以了解量角器中HTTP服务调用的状态? 我知道关于node-fetch包的信息,它通过发送请求并获取响应来作为典型的服务调用。但是我正在寻找的是,当应用程序运行时我们可以得到服务的状态,如果它返回了成功200或失败400等。我们在量角器中有这样的选择吗?

1 个答案:

答案 0 :(得分:0)

在测试环境中,我遇到了类似的问题。我需要访问应用程序内部功能,例如,检查某个请求是否已完成。

最终的解决方案是通过window对象公开功能。测试可以使用window访问browser.executeScript()

教程

在网络应用程序内:

  1. 创建一个class,其中包含您要在protractor测试中使用的所有功能。在这种情况下,我们希望将字符串传递给Web应用程序,将其记录下来,然后将其传递回测试。

export class E2EDriver {

    public give_id_back = async (id: string): Promise<string> => {
        // Application internal logic here. We can access anything since we are
        // within the real application.
        console.log("Driver is running something within web-application!, id:",id)
        return id
    }
}
  1. 将此类注入window对象中。
const global = window as any
global.e2e_driver = new E2EDriver()

在量角器测试中:

现在,窗口对象包含新添加的E2EDriver类。是时候获取访问权限了 在测试中向驾驶员发送:

  1. 通过browser.executeScript()
  2. 创建网桥

// This is a string of code which is passed to browser.executeAsyncScript()
const javascript_run_driver_fn = `

   // remove function name from args
   var args = [...arguments].splice(1);

   // remove callback provided by protractor from args
   var cb = args.splice(args.length-1, 1)[0];

   // invoke requested function with given args and respond using cb()
   e2e_driver[arguments[0]](...args).then(cb).catch(cb);
`;

// the real bridge..
const run_in_driver = async <T = void>(_browser: ProtractorBrowser, key: string, ...args: any[]): Promise<T> => {
   return await _browser.executeAsyncScript<T>(javascript_run_driver_fn, key, ...(args || []))
}

let driver: E2EDriver = null

// For gettign access to the driver in protractor tests.
export class E2eDriverApi {

   public static driver = async (_browser: ProtractorBrowser): Promise<E2eDriver> => {
       if(driver) {
           return driver
       }

       // get existing e2e-driver functions
       const real_driver = await _browser.executeScript<E2eDriver>("return e2e_driver;")
       const test_driver = { }

       // expose functions from real_driver using browser.executeScript() API
       // this creates the bridge..
       Object.keys(real_driver).forEach(k => {
           test_driver[k] = (...args: any[]) => run_in_driver(_browser, k, ...args)
       })

       driver = test_driver as E2eDriver
       return driver

   }
}

此代码从e2e_driver中获取window对象,并将其包装在新对象中。在这个新对象中,所有功能都将使用browser.executeAsyncScript()执行,并将返回结果。

不幸的是,E2EDriver仅限于使用返回Promise的函数,因为我们使用了此async API。

  1. 在某些测试中使用驱动程序:
import {  E2eDriverApi } from "./path/to/file"
import { browser } from "protractor"

describe("Given, web application", () => {

    describe("When started", () => {

        it("should e2e-driver be available", async () => {
            const driver = await E2eDriverApi.driver(browser)
            const id = await driver.give_id_back("I should be written to console")
            expect(id).toEqual("I should be written to console")
        })

    })
})

我希望这会有所帮助。 询问是否不清楚。

欢呼。!