diff --git a/CHANGE.md b/CHANGE.md
index 88fa772..1171b24 100644
--- a/CHANGE.md
+++ b/CHANGE.md
@@ -1,6 +1,12 @@
UI Recorder change log
====================
+## ver 2.4.7 (2017-3-20)
+
+1. Fix: insert var failed when add new var in iframe context
+2. Add: support get data-testid before get id
+3. Add: add new feature eval jscode in browser side
+
## ver 2.4.6 (2017-3-18)
1. Add: add localhost hosts tip for mac system
diff --git a/chrome-extension/img/jscode.png b/chrome-extension/img/jscode.png
new file mode 100644
index 0000000..643faa5
Binary files /dev/null and b/chrome-extension/img/jscode.png differ
diff --git a/chrome-extension/js/foreground.js b/chrome-extension/js/foreground.js
index b5b3696..66e1174 100644
--- a/chrome-extension/js/foreground.js
+++ b/chrome-extension/js/foreground.js
@@ -153,7 +153,7 @@
var relativePath = '';
var tagName = target.nodeName.toLowerCase();
var tempPath;
- var idValue = target.getAttribute && mapPathAttrs.id && target.getAttribute('id');
+ var idValue = target.getAttribute && mapPathAttrs.id && (target.getAttribute('data-testid') || target.getAttribute('id'));
var nameValue = target.getAttribute && mapPathAttrs.name && target.getAttribute('name');
var typeValue = target.getAttribute && target.getAttribute('type');
var valueValue = target.getAttribute && target.getAttribute('value');
@@ -213,7 +213,7 @@
var body = target.ownerDocument.body;
while(current !== null){
if(current.nodeName !== 'HTML'){
- var idValue = current.getAttribute && current.getAttribute('id');
+ var idValue = current.getAttribute && (current.getAttribute('data-testid') || current.getAttribute('id'));
if(idValue && reAttrValueBlack.test(idValue) === false && checkUniqueSelector(body, '#'+idValue, isAllDom)){
return {
node: current,
@@ -759,6 +759,9 @@
var target = elements[0];
target.focus();
var varinfo = event.varinfo;
+ if(varinfo.isNew){
+ testVars[varinfo.name] = varinfo.value;
+ }
target.value = getVarStr(eval('\`'+varinfo.template+'\`'));
GlobalEvents.emit('showDomPath', path);
saveCommand('insertVar', {
@@ -772,6 +775,16 @@
}
});
+ // 执行JS
+ GlobalEvents.on('eval', function(event){
+ var frameId = getFrameId();
+ if(frameId === event.frame){
+ var code = event.code;
+ eval(code);
+ saveCommand('eval', code);
+ }
+ });
+
// 更新变量
GlobalEvents.on('updateVar', function(event){
var frameId = getFrameId();
@@ -1598,8 +1611,8 @@
'
DomPath:
',
''+__('attr_switch')+'data-id
',
''+__('attr_black')+'
',
- '',
- ''
+ '',
+ ''
];
divDomToolsPannel.innerHTML = arrHTML.join('');
var diffX = 0, diffY =0;
@@ -1720,6 +1733,17 @@
});
});
break;
+ case 'uirecorder-jscode':
+ hideDialog();
+ showSelector(function(domInfo, requirePause){
+ showJSCodeDialog(domInfo, function(code){
+ GlobalEvents.emit('eval', {
+ frame: domInfo.frame,
+ code: code
+ });
+ });
+ });
+ break;
case 'uirecorder-jump':
showJumpDailog();
break;
@@ -1764,7 +1788,7 @@
'',
'',
'',
- ''
+ ''
];
divDomDialog.innerHTML = arrHTML.join('');
document.body.appendChild(divDomDialog);
@@ -1788,12 +1812,10 @@
break;
}
});
- divDomDialog.addEventListener('keyup', function(event){
+ divDomDialog.addEventListener('keydown', function(event){
var keyCode = event.keyCode;
- switch(keyCode){
- case 13:
- okCallback();
- break;
+ if(keyCode === 13 && (event.ctrlKey || event.metaKey)){
+ okCallback();
}
});
document.addEventListener('keyup', function(event){
@@ -2211,6 +2233,33 @@
});
}
+ function showJSCodeDialog(domInfo, callback){
+ var strHtml = '
';
+ setGlobalWorkMode('pauseAll');
+ var domCode;
+ showDialog(__('dialog_jscode_title'), strHtml, {
+ onInit: function(){
+ domCode = document.getElementById('uirecorder-code');
+ domCode.select();
+ domCode.focus();
+ },
+ onOk: function(){
+ var code = domCode.value;
+ if(code){
+ callback(code);
+ hideDialog();
+ }
+ else{
+ domCode.focus();
+ alert(__('dialog_jscode_tip'));
+ }
+ },
+ onCancel: function(){
+ setGlobalWorkMode('record');
+ }
+ });
+ }
+
function showJumpDailog(){
var arrHtmls = [
'',
diff --git a/chrome-extension/js/mobile.js b/chrome-extension/js/mobile.js
index 190ea54..5d221b6 100644
--- a/chrome-extension/js/mobile.js
+++ b/chrome-extension/js/mobile.js
@@ -130,12 +130,10 @@
break;
}
});
- divDomDialog.addEventListener('keyup', function(event){
+ divDomDialog.addEventListener('keydown', function(event){
var keyCode = event.keyCode;
- switch(keyCode){
- case 13:
- okCallback();
- break;
+ if(keyCode === 13 && (event.ctrlKey || event.metaKey)){
+ okCallback();
}
});
document.addEventListener('keyup', function(event){
diff --git a/chrome-extension/manifest.json b/chrome-extension/manifest.json
index f3c8406..69c02f7 100644
--- a/chrome-extension/manifest.json
+++ b/chrome-extension/manifest.json
@@ -28,7 +28,8 @@
"img/fail.png",
"img/text.png",
"img/alert.png",
- "img/back.png"
+ "img/back.png",
+ "img/jscode.png"
],
"background": {
"scripts": [ "js/background.js" ]
diff --git a/i18n/en.js b/i18n/en.js
index ee9da6b..02767da 100644
--- a/i18n/en.js
+++ b/i18n/en.js
@@ -64,6 +64,7 @@
"button_sleep_text": "Add Sleep",
"button_expect_text": "Add Expect",
"button_vars_text": "Use Var",
+ "button_jscode_text": "Run JS",
"button_jump_text": "Jump to",
"button_end_text": "End Record",
"button_text_text": "Input Text",
@@ -105,6 +106,9 @@
"dialog_alert_title": "Alert Cmd: ",
"dialog_alert_option": "Alert option: ",
"dialog_alert_option_accpet": "Accpet",
- "dialog_alert_option_dismiss": "Dismiss"
+ "dialog_alert_option_dismiss": "Dismiss",
+ "dialog_jscode_title": "Run JS",
+ "dialog_jscode_code": "JS Code",
+ "dialog_jscode_tip": "Please input jscode run in browser side,E.g.: document.title='test';"
}
}
diff --git a/i18n/zh-cn.js b/i18n/zh-cn.js
index c9782d4..5c11ef4 100644
--- a/i18n/zh-cn.js
+++ b/i18n/zh-cn.js
@@ -64,6 +64,7 @@
"button_sleep_text": "添加延迟",
"button_expect_text": "添加断言",
"button_vars_text": "使用变量",
+ "button_jscode_text": "执行JS",
"button_jump_text": "脚本跳转",
"button_end_text": "结束录制",
"button_text_text": "输入文字",
@@ -105,6 +106,9 @@
"dialog_alert_title": "Alert命令: ",
"dialog_alert_option": "Alert选项: ",
"dialog_alert_option_accpet": "接受",
- "dialog_alert_option_dismiss": "拒绝"
+ "dialog_alert_option_dismiss": "拒绝",
+ "dialog_jscode_title": "执行JS",
+ "dialog_jscode_code": "JS代码",
+ "dialog_jscode_tip": "请输入浏览器端执行的JS代码,例如: document.title='test';"
}
}
diff --git a/i18n/zh-tw.js b/i18n/zh-tw.js
index 1e652fe..4fca760 100644
--- a/i18n/zh-tw.js
+++ b/i18n/zh-tw.js
@@ -64,6 +64,7 @@
"button_sleep_text": "添加延遲",
"button_expect_text": "添加斷言",
"button_vars_text": "使用變量",
+ "button_jscode_text": "執行JS",
"button_jump_text": "腳本跳轉",
"button_end_text": "結束錄制",
"button_text_text": "輸入文字",
@@ -105,6 +106,9 @@
"dialog_alert_title": "Alert命令: ",
"dialog_alert_option": "Alert選項: ",
"dialog_alert_option_accpet": "接受",
- "dialog_alert_option_dismiss": "拒絕"
+ "dialog_alert_option_dismiss": "拒絕",
+ "dialog_jscode_title": "執行JS",
+ "dialog_jscode_code": "JS代碼",
+ "dialog_jscode_tip": "請輸入瀏覽器端執行的JS代碼,例如: document.title='test';"
}
}
diff --git a/lib/init.js b/lib/init.js
index 620567e..c3b9185 100644
--- a/lib/init.js
+++ b/lib/init.js
@@ -30,7 +30,7 @@ function initConfig(options){
if(!mobile){
config.recorder = config.recorder || {};
recorder = config.recorder;
- recorder.pathAttrs = recorder.pathAttrs || 'data-test,data-id,data-name,type,data-type,role,data-role,data-value';
+ recorder.pathAttrs = recorder.pathAttrs || 'data-id,data-name,type,data-type,role,data-role,data-value';
recorder.attrValueBlack = recorder.attrValueBlack || '';
recorder.hideBeforeExpect = recorder.hideBeforeExpect || '';
webdriver.browsers = webdriver.browsers || 'chrome, ie 11';
diff --git a/lib/start.js b/lib/start.js
index 30357e1..2c19e06 100644
--- a/lib/start.js
+++ b/lib/start.js
@@ -593,6 +593,10 @@ function startRecorder(options){
isPageError(code).should.be.false;
}).then(doNext).catch(catchError) || doNext();
break;
+ case 'eval':
+ pushTestCode('eval', '', data.replace(/\n/g, ' \\n '), 'return driver.eval(\''+escapeStr(data)+'\');');
+ checkerBrowser && checkerBrowser.eval(data).then(doNext).catch(catchError) || doNext();
+ break;
case 'mouseMove':
arrCodes = [];
arrCodes.push('return driver.sleep(300).wait(\''+escapeStr(data.path)+'\', 30000)');
diff --git a/package.json b/package.json
index 73da104..8515b34 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "uirecorder",
- "version": "2.4.6",
+ "version": "2.4.7",
"description": "A tool for record ui test case",
"main": "./index",
"bin": {
diff --git a/tool/uirecorder.crx b/tool/uirecorder.crx
index 963b979..9bb0974 100644
Binary files a/tool/uirecorder.crx and b/tool/uirecorder.crx differ