一尘不染

在端到端测试中使用跨平台键盘快捷键

selenium

问题:

在相当大的测试代码库中,我们使用了不同的键盘快捷键。例如,要复制所选文本,我们使用CTRL/COMMAND + C,粘贴CTRL/COMMAND + v,打开一个新标签页CTRL/COMMAND + T等。

为了保持在多个平台上的测试工作, 我们想使CTRLVS
COMMAND选择自动取决于在什么平台上的目标浏览器上运行
。为了确定目标平台,我们目前正在使用以下帮助程序功能,该功能使用navigator.appVersion

this.getControlKey = function () {
    return browser.executeScript("return navigator.appVersion.indexOf('Mac');").then(function (isMac) {
        return isMac ? protractor.Key.COMMAND : protractor.Key.CONTROL;
    });
};

这种方法的问题是getControlKey()返回一个承诺,并且每次使用它时,我们都必须明确地解决该承诺:

helpers.getControlKey().then(function (controlKey) {
    elm.sendKeys(protractor.Key.chord(controlKey, "c"));
});

问题:

  1. 是否可以避免嵌套并简化使用getControlKey()?理想情况下,我希望它像这样简单:

    elm.sendKeys(protractor.Key.chord(helpers.getControlKey(), "c"));
    
  2. 是否使用navigator.appVersion最佳方法来确定目标平台,还有更好的方法吗?


阅读 301

收藏
2020-06-26

共1个答案

一尘不染

对于两种情况,这是我的最佳答案,

  • 如果多个测试人员在自己的计算机上运行脚本,则可以将helper方法放置在onPrepare()将值分配给常量全局变量的函数中,该变量可用于所有测试。

  • 如果所有测试都在将所有测试随机分配给不同机器的分布式平台上运行,则在这种情况下编写辅助方法,将值分配给该测试中beforeAll()函数的恒定局部变量将是有用的。

转到第二个问题,还有另一种方法,我们可以使用量角器getCapabilities()方法获得在其上执行测试规范的平台。

获取平台类型的代码-

//Below code can be placed either in `onPrepare()` function or `beforeAll()` function depending the need.
//If the below code is placed in the `beforeAll()` function then i guess there won't be any need for a global variable.

browser.controlKey = protractor.Key.CONTROL; //browser.controlKey is a global variable and can be accessed anywhere in the test specs
browser.getCapabilities().then(function(capabilities){
    if(capabilities.caps_.platform === "MAC")
        browser.controlKey = protractor.Key.COMMAND;
});

用法:

elm.sendKeys(protractor.Key.chord(browser.controlKey, "c")); //if its stored as global variable

希望能帮助到你。

2020-06-26