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')+'
', - '
'+__('button_hover_text')+''+__('button_sleep_text')+''+__('button_expect_text')+''+__('button_vars_text')+''+__('button_jump_text')+''+__('button_end_text')+'
', - '' + '
'+__('button_hover_text')+''+__('button_sleep_text')+''+__('button_expect_text')+''+__('button_vars_text')+''+__('button_jscode_text')+''+__('button_jump_text')+''+__('button_end_text')+'
', + '' ]; 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 @@ '

', '
', '
'+__('dialog_ok')+''+__('dialog_cancel')+'
', - '' + '' ]; 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 = [ '