【问题标题】:Using Intern in conjunction with Selenium and dynamic proxyUrl将 Intern 与 Selenium 和动态 proxyUrl 结合使用
【发布时间】:2014-04-01 13:37:34
【问题描述】:

我的配置是由 grunt 启动的实习生测试环境和以下实习生配置(部分):

proxyPort: 9000,
proxyUrl: 'http://<my-ip>:9000',

问题在于硬编码的 my-ip。 Selenium 网格和节点在不同的机器/各自的 ips 上运行,实习生的配置文件将与所有构建和测试环境一起签入。

如果我将 proxyUrl 留在 localhost,selenium 节点将无法加载实习生测试的数据。

因此,my-ip 对于所有开发人员的测试都会有所不同。我真的不希望每个人都将自己的 ip 输入到实习生配置中并意外签入配置,也不希望签入模板文件以供所有人更改。

不要误会我的意思。设置工作得很好,但必须输入硬编码的本地 ip,我个人认为这是气味。

也许参数化 proxyURL 很容易,但我找不到任何资源 :(

问候,

流卡

【问题讨论】:

    标签: javascript unit-testing selenium-grid automated-tests intern


    【解决方案1】:

    从 Intern 1.6 开始,您可以从 intern.args 检索其他命令行参数:

    // in tests/config.js
    define([ 'intern' ], function (intern) {
      return {
        proxyUrl: intern.args.proxyUrl,
    
        // ... additional configuration ...
      };
    });
    
    $ intern-runner config=tests/config proxyUrl=http://www.example.com:1234/
    

    【讨论】:

    • 好吧,不过我们是通过 grunt 开始实习的,因此不提供自定义参数。有没有办法通过节点动态设置ip/主机名?
    • 您也可以将任意参数放入 Gruntfile 的配置中。
    • 是的,但是开发人员必须再次更改 grunt 文件......开发人员应该检查并运行 grunt。仅此而已,ip 和其他动态配置会自动调整。
    • 我找到了自动获取本地局域网ips并为intern.js动态构建proxyUrl设置属性的解决方案。结果如下所示。
    【解决方案2】:

    我发现了如何使用 os.networkInterfaces() 轻松获取当前 LAN ip,如 nodejs 文档 http://nodejs.org/api/os.html#os_os_networkinterfaces 中所述

    因此,如果需要为 intern.js 的静态 proxyUrl 配置标志自动动态获取 localLan ip,我们只需在例如的定义中添加相应的代码。您的 Gruntfile 作为 Grunt 本身正在 nodejs 环境中执行:

    /* jshint node: true*/
    "use strict";
    module.exports = function (grunt) {
        require("time-grunt")(grunt);
    
        var os = require('os');
        var interfaces = os.networkInterfaces(),
            localLanIp = null,
            setLocalLanIp = function (deviceDetails) {
                if (deviceDetails.family === 'IPv4' && !deviceDetails.internal) {
                    localLanIp = deviceDetails.address;
                }
                return localLanIp !== null;
            };
    
        for (var device in interfaces) {
            //just check devices containing LAN or eth
            if (device.indexOf("LAN") > -1 || device.indexOf("eth") > -1) {
                //as we can'T break a forEach on arrays we use some and break on return true.
                interfaces[device].some(setLocalLanIp);
                //break outer for as loaclIp is found.
                if (localLanIp !== null) {
                    break;
                }
            }
        }
    
        //if no ip found default to localhost anyway.
        if  (localLanIp === null) {
            localLanIp = "localhost";
        }
    
        grunt.initConfig({
    
            intern: {
                remote: {
                    options: {
                        runType: "runner",
                        config: "tests/intern.js",
                        reporters: [ "console" ],
                        suites: [ "tests/module" ],
                        proxyPort: 9000,
                        proxyUrl: 'http://' + localLanIp + ':' + 9000
                    }
                }
            }
        });
        grunt.loadNpmTasks("intern");
        grunt.registerTask("default", ["intern"]);
    };
    

    在我看来,默认使用本地 LAN ip 是个好主意,但如果您不能依赖 localhost 或 0.0.0.0 地址但不想手动编辑任何配置(或不能因为任何原因)。

    【讨论】:

    • 这个配置文件永远不会工作,因为 Node.js 模块不是 AMD 模块(所以加载 os 不会工作,它会抛出),并且 os 模块不存在浏览器,它也会加载这个配置文件进行单元测试……
    • 当然,在我匆忙中(复制了我们更复杂配置的部分),我将 Gruntfile 和 intern.js 配置混合在一起......当然,示例位于 Gruntfile.js 配置实习生中。我将添加一个具有正确配置的新代码示例。感谢您的提示,只是在编写时没有看到它(应该先检查剥离的示例)。
    猜你喜欢
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多