1

每次我执行console.log(text);时,它都会在控制台中附加两个数字,用破折号分隔。[nn]

当运行并发浏览器时,第二个数字表示浏览器 - 或工作人员 - 编号。下面是五个并发浏览器的输出,其中一个已经完成。

[0-2] * Selected 'US Citizen' from 'Citizenship' list
[0-4] Clicked '- County -'
[0-6] Clicked 'District of Columbia' button
[0-2] Clicked 'Next' button
[0-3] Clicked 'Next' button
[0-5] * ... PageSync completed in 2.481 sec. *

我想使用工人编号将浏览器排列到五个屏幕位置以进行演示,WebdriverIO 中的 MOD 为 5。

有没有办法返回工人编号的实例?

还是有其他方法可以完成这一壮举?

我在想也许读取和增加一个系统变量,但我想知道这是否会导致竞争条件?

4

1 回答 1

1

没有看到你的设置,我无法给你一个完整的解决方案;但是,我可以提供一些可能有用的见解。

我假设您正在同时运行测试。如果是这样,那么您可能在 wdio.conf.js 中配置了不止一项功能,如下所示:

{
        //maxInstances: 1,
        browserName: 'chrome',
        // Set 1
        specs: './tests/set1/**/*.spec.js',
    },
    {
        //maxInstances: 1,
        browserName: 'chrome',
        // Set 2
        specs: './tests/set2/**/*.spec.js',
    },

您可以采取两种方法。在方法 #1 中,我们将使用供应商前缀将我们自己的 ID 添加到每个功能。在方法 #2 中,我们将获得对实际能力 ID 的引用,这是您在日志中括号中标识的 ID。

方法一

这些功能可以通过您的任何一项测试以及 wdio.conf.js 挂钩使用browser.options.capabilities. 所以我们可以为每个能力分配一个索引 ID,如下所示:

{
        //maxInstances: 1,
        browserName: 'chrome',
        // Set 1
        specs: './tests/set1/**/*.spec.js',
        'wdio:id': 1
    },
    {
        //maxInstances: 1,
        browserName: 'chrome',
        // Set 2
        specs: './tests/set2/**/*.spec.js',
        'wdio:id': 2
    },

在每个测试中,以及 wdio.conf.js 钩子中,我们可以知道测试在 5 个浏览器中的哪一个上运行,如下所示:

describe('Example Suite', () => {
    before(() => {
        console.log('Test is running on browser number ' + browser.options.capabilities['wdio:id']);
        // this outputs either 1, 2, 3, 4, or 5 depending on which browser the test is running on. You can use this to determine where you want to position the browser on the screen.
    });

由于您不想在每个测试中都执行此操作,因此在 WebdriverIO beforeTest、beforeSuite 或 hook 之前执行此操作会更好:

beforeTest: function (test, context) { 
        console.log('ID = ' + browser.options.capabilities['wdio:id']);
        // outputs either 1, 2, 3, 4, or 5 depending on which browser the test runs on
}

方法二

方法 2 类似于方法 #1,除了计算位置可能更困难,因为您不控制分配给每个浏览器的实际 ID。但是,我将向您展示如何访问 CID,以防万一证明它对您来说是一个更好的选择。

与方法 #1 一样,我们假设您具有以下多种功能:

{
        //maxInstances: 1,
        browserName: 'chrome',
        // Set 1
        specs: './tests/set1/**/*.spec.js',
    },
    {
        //maxInstances: 1,
        browserName: 'chrome',
        // Set 2
        specs: './tests/set2/**/*.spec.js',
    },

WebdriverIO 有一个名为 的钩子onWorkerStart,WebdriverIO 将 CID 作为参数之一传递给它。WebdriverIO 还将功能作为参数传递给此函数。由于我们知道我们可以从browser.options.capabilities对象内部访问功能,因此我们可以截取 wdio.conf.js onWorkerStart 中的 CID 并将其分配为功能对象上的供应商前缀属性,如下所示:

    onWorkerStart: function (cid, caps, specs, args, execArgv) {
        console.log('onWorkerStart: cid = ' + cid)
        caps['wdio:cid'] = cid;
    },

稍后,我们可以在测试中或在另一个钩子中访问它,如下所示:

    beforeTest: function (test, context) { 
        console.log('beforeTest: CID = ' + browser.options.capabilities['wdio:cid']);
        // do something here with the CID, since the browser object is available
    //...
    },

有关在 WebdriverIO 中使用功能 ID 的其他用例的更多信息,请参阅我的文章识别哪个 Worker 正在运行 WebdriverIO 测试。

于 2021-10-23T14:31:42.537 回答