WebdriverIO:如何从 wdio.conf.js 读取 baseURL 值。内部步骤定义文件

Posted

技术标签:

【中文标题】WebdriverIO:如何从 wdio.conf.js 读取 baseURL 值。内部步骤定义文件【英文标题】:WebdriverIO: How to read baseURL value from wdio.conf.js. inside step definition file 【发布时间】:2017-11-18 04:12:44 【问题描述】:

我正在使用 WebdriverIO 进行测试自动化。在wdio.conf.js 文件中,我配置了“baseUrl”属性。

我想读取我的测试.js 文件中的“baseUrl”属性值。我该怎么做?

【问题讨论】:

您想使用来自wdio.config.js 文件还是来自test.js 的文件?你写的太草率了,我不知道你想要什么。请编辑您的问题并更具体。 【参考方案1】:

❒ wdio-v5

最近,在为项目重写编写了大量测试之后,我开始相信存储/访问全局配置变量的最佳方法是通过 global 对象。

您可以在wdio.conf.js 文件的挂钩中定义它们。我在before 钩子中定义了我的:

before: function (capabilities, specs) 
  // =================
  // Assertion Library
  // =================
  const chai    = require('chai');
  global.expect = chai.expect;
  global.assert = chai.assert;
  global.should = chai.should();
  // ======================
  // Miscellaneous Packages
  // ======================
  global.langCode = langCode;
  global.countryCode = countryCode;
  global.request = require('superagent');
  global.allowedStatusCodes = [200, 301],
  // ===============
  // Custom Commands
  // ===============
  require('./test/custom_commands/aFancyMethod');
  require('./test/custom_commands/anotherOne');
  require('./test/custom_commands/andAnotherOne');
,

然后,您可以直接访问它们,在您的测试文件或页面对象中的任何位置。这样,您可以大大减少测试文件的占用空间(errr...codeprint),因为您可以直接在测试用例中调用它们:

describe(`Testing a random URL`, () => 
  it('Should return a HTTP valid status code', async () => 
    // Issue a HTTP request for the given URL:
    await request
      .head('https://random.org')
      .then(res => 
        console.info(`\n> Status code found: $res.status | MIME type found: '$res.type'\n`);
        foundStatusCode = res.status;
      )
      .catch(err => 
        console.info(`\n> Status code found: $err.status | Error response found: '$JSON.stringify(err.response)'\n`);
        foundStatusCode = err.status;
      );
    // Assert the HTTP Status Code:
    assert.include(allowedStatusCodes, foundStatusCode, `!AssertError: Route yields a bad status code! Got: $foundStatusCode | Expected: $allowedStatusCodes`);
  ); 

与总是做await browser.options.request.head(...browser.options.baseUrl等相反。


❒ wdio-v4

所有wdio.conf.js 文件属性(基本上是config 对象名称-值对)也存储在browser.options 对象中。

因此,从测试内部访问全局配置值的更优雅的方法如下所示:

> browser.options
 port: 4444,
  protocol: 'http',
  waitforTimeout: 10000,
  waitforInterval: 500,
  coloredLogs: true,
  deprecationWarnings: false,
  logLevel: 'verbose',
  baseUrl: 'http://localhost',
  // ... etc ...


> browser.options.baseUrl
'http://localhost'

我会在这里冒个险,假设您想将baseUrl 值从您的wdio.config.js 文件中读取到您的test.js 文件中。

TL;DR:在您的 test.js 文件标题中,添加以下内容:

var config = require('<pathToWdioConfJS>/wdio.conf.js').config;

然后您可以通过config.<configOption> 访问任何wdio.config.js 值,在您的情况下为config.baseUrl


最后,我强烈推荐您阅读有关 exports and module exports 的文章。

WebdriverIO 是基于 NodeJS 构建的,所以如果您不知道如何以及何时使用 exportsmodule.exportsrequire 或它们之间的区别,那么从长远来看,您将自食其果。

【讨论】:

谢谢 iamdanchiv :) 感谢这是我见过的关于如何从配置文件访问变量的最佳解释!【参考方案2】:

使用 browser.options.baseUrl 。如果您使用 require,您可以从该文件进行硬编码,这很好,但您不能执行 wdio --baseUrl=http://myTestSite2.net 来覆盖“全局”baseUrl。您将来可能希望在多个部署中执行此操作。

【讨论】:

【参考方案3】:

只需将所有变量保存在 before: 函数中,即可在测试中的任何地方使用。 像下面的例子我使用重试计数 wdio 配置文件

before: function (capabilities, specs) 
         expect = require('chai').expect;
         should = require('chai').should();
         assert = require('assert');
         retryCount=2;
         browser.maximizeWindow();

【讨论】:

【参考方案4】:

wdio.config.js 文件中定义这样的 url

var baseUrl = 'YOUR URL'
exports.config = 
        baseUrl: baseUrl,

在测试文件中使用/而不是在browser.url('/')中添加完整的url,它将使用wdio.config.js文件中的baseUrl。

browser.url('/')

【讨论】:

【参考方案5】:

BaseUrl 在配置对象 browser.config.baseUrl 中可用 见https://github.com/webdriverio/webdriverio/blob/a4a5a46f786f8548361d7f86834b38f89dcb1690/packages/webdriverio/webdriverio-core.d.ts#L131

【讨论】:

以上是关于WebdriverIO:如何从 wdio.conf.js 读取 baseURL 值。内部步骤定义文件的主要内容,如果未能解决你的问题,请参考以下文章

如何从 WebdriverIO 中的 WebElement 继承

如何使用 WebdriverIO 上传文件

如何在 VS Code 上获得 WebdriverIO 自动完成功能

如何在VScode中调试Webdriverio黄瓜框架

WebDriverIO Selenium 将命令行参数从 config.js 文件传递​​到 Chrome

如何在独立模式下调试 webdriverio?