跳至主要内容

自定义服务

您可以为 WDIO 测试运行器编写自己的自定义服务以满足您的特定需求。

服务是为可重用逻辑创建的附加组件,用于简化测试、管理测试套件和集成结果。服务可以访问wdio.conf.js中可用的所有相同的钩子

可以定义两种类型的服务:启动器服务,它仅可以访问onPrepareonWorkerStartonWorkerEndonComplete钩子,这些钩子每个测试运行仅执行一次;以及工作器服务,它可以访问所有其他钩子,并且每个工作器都会执行一次。请注意,您不能在两种类型的服务之间共享(全局)变量,因为工作器服务在不同的(工作器)进程中运行。

启动器服务可以按如下方式定义

export default class CustomLauncherService {
// If a hook returns a promise, WebdriverIO will wait until that promise is resolved to continue.
async onPrepare(config, capabilities) {
// TODO: something before all workers launch
}

onComplete(exitCode, config, capabilities) {
// TODO: something after the workers shutdown
}

// custom service methods ...
}

而工作器服务应该如下所示

export default class CustomWorkerService {
/**
* `serviceOptions` contains all options specific to the service
* e.g. if defined as follows:
*
* ```
* services: [['custom', { foo: 'bar' }]]
* ```
*
* the `serviceOptions` parameter will be: `{ foo: 'bar' }`
*/
constructor (serviceOptions, capabilities, config) {
this.options = serviceOptions
}

/**
* this browser object is passed in here for the first time
*/
async before(config, capabilities, browser) {
this.browser = browser

// TODO: something before all tests are run, e.g.:
await this.browser.setWindowSize(1024, 768)
}

after(exitCode, config, capabilities) {
// TODO: something after all tests are run
}

beforeTest(test, context) {
// TODO: something before each Mocha/Jasmine test run
}

beforeScenario(test, context) {
// TODO: something before each Cucumber scenario run
}

// other hooks or custom service methods ...
}

建议通过构造函数中传递的参数存储浏览器对象。最后,将这两种类型的 worker 暴露如下

import CustomLauncherService from './launcher'
import CustomWorkerService from './service'

export default CustomWorkerService
export const launcher = CustomLauncherService

如果您正在使用 TypeScript 并希望确保钩子方法的参数类型安全,则可以按如下方式定义服务类

import type { Capabilities, Options, Services } from '@wdio/types'

export default class CustomWorkerService implements Services.ServiceInstance {
constructor (
private _options: MyServiceOptions,
private _capabilities: Capabilities.RemoteCapability,
private _config: Options.Testrunner
) {
// ...
}

// ...
}

服务错误处理

在服务钩子期间抛出的错误将在记录时,运行器继续执行。如果服务中的钩子对于测试运行器的设置或拆卸至关重要,则可以使用webdriverio包中公开的SevereServiceError来停止运行器。

import { SevereServiceError } from 'webdriverio'

export default class CustomServiceLauncher {
async onPrepare(config, capabilities) {
// TODO: something critical for setup before all workers launch

throw new SevereServiceError('Something went wrong.')
}

// custom service methods ...
}

从模块导入服务

现在为了使用此服务,唯一需要做的事情就是将其分配给services属性。

修改您的wdio.conf.js文件使其如下所示

import CustomService from './service/my.custom.service'

export const config = {
// ...
services: [
/**
* use imported service class
*/
[CustomService, {
someOption: true
}],
/**
* use absolute path to service
*/
['/path/to/service.js', {
someOption: true
}]
],
// ...
}

在 NPM 上发布服务

为了使 WebdriverIO 社区更容易使用和发现服务,请遵循以下建议

  • 服务应使用此命名约定:wdio-*-service
  • 使用 NPM 关键字:wdio-pluginwdio-service
  • main入口应export服务的实例
  • 示例服务:@wdio/sauce-service

遵循推荐的命名模式允许按名称添加服务

// Add wdio-custom-service
export const config = {
// ...
services: ['custom'],
// ...
}

将已发布的服务添加到 WDIO CLI 和文档

我们非常感谢每个可以帮助其他人运行更好测试的新插件!如果您创建了这样的插件,请考虑将其添加到我们的 CLI 和文档中,以便更容易找到它。

请使用以下更改提交拉取请求

欢迎!我怎样才能帮助您?

WebdriverIO AI Copilot