无法在 Protractor 中使用 public 密钥加密字符串
Not able to encrypt a string with a public key in Protractor
我正在尝试调用下面提到的加密函数:
var encryptor = require("./jsencrypt.js");
this.encrypt = function () {
var key="LxVtiqZV6g2D493gDBfG0BfV6sAhteG6hOCAu48qO00Z99OpiaIG5vZxVtiqZV8C7bpwIDAQAB";
encryptor = new JSEncrypt();
encryptor.setPublicKey(key);
var newString = encryptor.encrypt('Password');
console.log("Encrypted password =",newString);
}
最初我收到未定义 JSEncrypt 的引用错误。
所以我下载了 jsencrypt.js 文件并在开头添加了 var encryptor = require("./jsencrypt.js");
。
现在我收到以下错误:
Message:
ReferenceError: navigator is not defined
Stacktrace:
ReferenceError: navigator is not defined
at e:\Praveen Data\Projects\ECP\CentralRegistryUI\TestScripts\Utils\jsencrypt.js:73:13
at Object.<anonymous> (e:\Praveen Data\Projects\ECP\CentralRegistryUI\TestScripts\Utils\jsencrypt.js:4342:3)
at require (module.js:385:17)
尝试在 jsencrypt.js 中使用 windows.navigator,但没有成功。
Protractor 测试在浏览器环境中不是 运行,而是在 node.js 中,因为导航器对象在那里不可用。 JSEncrypt 依靠它在客户端跨不同的浏览器和版本工作。
它在 JSEncrypt 代码中的许多地方都被引用,所以我最好的选择是要么切换到一个适合你的服务器端加密库,要么如果不可能模拟一个全局导航器 json 对象与所有预期 properties/methods 就好像它是 Chrome 浏览器一样 - node.js 运行 在 chrome 的 js 引擎上应该可以正常工作。
我的一位同事帮助我解决了这个问题。
所以这里我有一个加密函数:
this.initializeEncryptedPassword = () => {
//console.log("before calling encrypt... ");
browser.executeScript(() => {
//console.log("Starting to return encryptor...");
return window.loginEncryptor.encrypt(window.loginPassword);
}).then((encryptedPassword) => {
this.encryptedPassword = encryptedPassword;
});
//console.log("after calling encrypt...");
}
此函数正在被调用:
export default class Encryptor {
constructor($window, $http) {
'ngInject';
this.encryptor = new $window.JSEncrypt();
//Need to use HTTP here instead of resource since the resource does not return plain text.
//Getting Public Key by hitting a rest uri.
$http({method: "GET", url: "/xyz/authenticate"}).success((item) => {
this.encryptor.setPublicKey(item);
//set the current encryptor on the window so that testing can use it
$window.loginEncryptor = this.encryptor;
});
}
encryptPassword(credentials) {
credentials.password = this.encryptor.encrypt(credentials.password);
}
}
希望这对其他人有帮助。
在require('jsencrypt')之前可以先这样写:
const { JSDOM } = require('jsdom');
const jsdom = new JSDOM('<!doctype html><html><body></body></html>');
const { window } = jsdom;
global.window = window;
global.document = window.document;
global.navigator ={userAgent: 'node.js'};
const { JSEncrypt } = require('jsencrypt')
您可以通过执行以下操作进行模拟:
global.navigator = { appName: 'protractor' };
global.window = {};
const JSEncrypt = require('JSEncrypt').default;
我正在尝试调用下面提到的加密函数:
var encryptor = require("./jsencrypt.js");
this.encrypt = function () {
var key="LxVtiqZV6g2D493gDBfG0BfV6sAhteG6hOCAu48qO00Z99OpiaIG5vZxVtiqZV8C7bpwIDAQAB";
encryptor = new JSEncrypt();
encryptor.setPublicKey(key);
var newString = encryptor.encrypt('Password');
console.log("Encrypted password =",newString);
}
最初我收到未定义 JSEncrypt 的引用错误。
所以我下载了 jsencrypt.js 文件并在开头添加了 var encryptor = require("./jsencrypt.js");
。
现在我收到以下错误:
Message:
ReferenceError: navigator is not defined
Stacktrace:
ReferenceError: navigator is not defined
at e:\Praveen Data\Projects\ECP\CentralRegistryUI\TestScripts\Utils\jsencrypt.js:73:13
at Object.<anonymous> (e:\Praveen Data\Projects\ECP\CentralRegistryUI\TestScripts\Utils\jsencrypt.js:4342:3)
at require (module.js:385:17)
尝试在 jsencrypt.js 中使用 windows.navigator,但没有成功。
Protractor 测试在浏览器环境中不是 运行,而是在 node.js 中,因为导航器对象在那里不可用。 JSEncrypt 依靠它在客户端跨不同的浏览器和版本工作。
它在 JSEncrypt 代码中的许多地方都被引用,所以我最好的选择是要么切换到一个适合你的服务器端加密库,要么如果不可能模拟一个全局导航器 json 对象与所有预期 properties/methods 就好像它是 Chrome 浏览器一样 - node.js 运行 在 chrome 的 js 引擎上应该可以正常工作。
我的一位同事帮助我解决了这个问题。 所以这里我有一个加密函数:
this.initializeEncryptedPassword = () => {
//console.log("before calling encrypt... ");
browser.executeScript(() => {
//console.log("Starting to return encryptor...");
return window.loginEncryptor.encrypt(window.loginPassword);
}).then((encryptedPassword) => {
this.encryptedPassword = encryptedPassword;
});
//console.log("after calling encrypt...");
}
此函数正在被调用:
export default class Encryptor {
constructor($window, $http) {
'ngInject';
this.encryptor = new $window.JSEncrypt();
//Need to use HTTP here instead of resource since the resource does not return plain text.
//Getting Public Key by hitting a rest uri.
$http({method: "GET", url: "/xyz/authenticate"}).success((item) => {
this.encryptor.setPublicKey(item);
//set the current encryptor on the window so that testing can use it
$window.loginEncryptor = this.encryptor;
});
}
encryptPassword(credentials) {
credentials.password = this.encryptor.encrypt(credentials.password);
}
}
希望这对其他人有帮助。
在require('jsencrypt')之前可以先这样写:
const { JSDOM } = require('jsdom');
const jsdom = new JSDOM('<!doctype html><html><body></body></html>');
const { window } = jsdom;
global.window = window;
global.document = window.document;
global.navigator ={userAgent: 'node.js'};
const { JSEncrypt } = require('jsencrypt')
您可以通过执行以下操作进行模拟:
global.navigator = { appName: 'protractor' };
global.window = {};
const JSEncrypt = require('JSEncrypt').default;