在端到端测试中使用跨平台键盘快捷键
Using cross-platform keyboard shortcuts in end-to-end testing
问题:
在我们相当大的测试代码库中,我们使用不同的键盘快捷键。例如,要复制我们正在使用的选定文本 CTRL/COMMAND + C
、粘贴 CTRL/COMMAND + v
、打开新选项卡 CTRL/COMMAND + T
等
为了在多个平台上进行测试,我们希望根据目标浏览器的平台自动选择 CTRL
与 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()
returns 一个承诺,每次我们使用它时,我们都必须显式解决承诺:
helpers.getControlKey().then(function (controlKey) {
elm.sendKeys(protractor.Key.chord(controlKey, "c"));
});
问题:
是否可以避免嵌套,简化getControlKey()
的使用?理想情况下,我希望它能像这样简单地工作:
elm.sendKeys(protractor.Key.chord(helpers.getControlKey(), "c"));
使用navigator.appVersion
是否是确定目标平台的最佳方法,还有更好的方法吗?
对于这两种情况,这是我最好的回答你的第一个问题 -
如果多个测试者运行自己机器上的脚本,辅助方法可以放在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
希望对您有所帮助。
问题:
在我们相当大的测试代码库中,我们使用不同的键盘快捷键。例如,要复制我们正在使用的选定文本 CTRL/COMMAND + C
、粘贴 CTRL/COMMAND + v
、打开新选项卡 CTRL/COMMAND + T
等
为了在多个平台上进行测试,我们希望根据目标浏览器的平台自动选择 CTRL
与 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()
returns 一个承诺,每次我们使用它时,我们都必须显式解决承诺:
helpers.getControlKey().then(function (controlKey) {
elm.sendKeys(protractor.Key.chord(controlKey, "c"));
});
问题:
是否可以避免嵌套,简化
getControlKey()
的使用?理想情况下,我希望它能像这样简单地工作:elm.sendKeys(protractor.Key.chord(helpers.getControlKey(), "c"));
使用
navigator.appVersion
是否是确定目标平台的最佳方法,还有更好的方法吗?
对于这两种情况,这是我最好的回答你的第一个问题 -
如果多个测试者运行自己机器上的脚本,辅助方法可以放在
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
希望对您有所帮助。