当我们运行任何Web应用程序时,应用程序都会在内部调用Web服务,以任何方式我们都可以了解量角器中HTTP服务调用的状态? 我知道关于node-fetch包的信息,它通过发送请求并获取响应来作为典型的服务调用。但是我正在寻找的是,当应用程序运行时我们可以得到服务的状态,如果它返回了成功200或失败400等。我们在量角器中有这样的选择吗?
答案 0 :(得分:0)
在测试环境中,我遇到了类似的问题。我需要访问应用程序内部功能,例如,检查某个请求是否已完成。
最终的解决方案是通过window
对象公开功能。测试可以使用window
访问browser.executeScript()
。
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
}
}
window
对象中。const global = window as any
global.e2e_driver = new E2EDriver()
现在,窗口对象包含新添加的E2EDriver
类。是时候获取访问权限了
在测试中向驾驶员发送:
browser.executeScript()
// 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。
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")
})
})
})
我希望这会有所帮助。 询问是否不清楚。
欢呼。!