RobotFramework:拖放 Selenium2 关键字似乎不起作用
RobotFramework: Drag And Drop Selenium2 Keyword seems not to work
我正在测试网络应用程序(使用 RobotFramework 和 Selenium2Library),其中有几个点需要一些拖放操作。我尝试了 Drag And Drop 关键字,但它无法正常工作。
由于无法通过生产应用程序,我使用下面的页面重现了问题:
https://html5demos.com/drag/
我的代码是:
*** Settings ***
Library Selenium2Library
*** Variables ***
${URL} = https://html5demos.com/drag/
*** Test Cases ***
Prepare Browser
Open_Browser ${url} browser=chrome
Maximize Browser Window
Make Test
#Drag And Drop //*[@id="one"] //*[@id="bin"]
#Drag And Drop //*[@id="two"] //*[@id="bin"]
Capture Page Screenshot
Sleep 1
Close All
Close Browser
已尝试使用 Python 2.7 和 3.6。
我得到的输出是 测试显示为通过 ,但我看不到拖放操作的任何实际结果(在我的生产应用程序和上面链接的示例页面中) .
Screenshot of drag and drop test results
当我查看测试期间浏览器中发生的情况时,我注意到该对象变得 可拖动(引号 "drag me" 添加在括号中)但测试代表记录时间。当鼠标光标移动时,测试继续进行上述int PASS,但没有实际效果。
在最新的 Chrome、Firefox、IE 上试过。还尝试使用关键字 Mouse Down、Mouse Over、Mouse Up,但结果相同。
这是执行报告的日志截图:
Execution report screenshot
我将不胜感激任何帮助或解决方法以正确完成它。
从 [so] 上的其他帖子来看,此功能似乎效果不佳。出于这个原因,大多数答案都包含使用 JavaScript 来创建解决方案的建议。我已将此 中的示例改编为与 Robot Framework 一起使用:
drag-n-drop.js
var dataTransfer=
{
dropEffect:'',
effectAllowed:'all',
files:[],
items:{},
types:[],
setData:function(format,data)
{
this.items[format]=data;
this.types.push(format);
},
getData:function(format)
{
return this.items[format];
},
clearData:function(format){}
};
var emit=function(event,target)
{
var evt=document.createEvent('Event');
evt.initEvent(event,true,false);
evt.dataTransfer=dataTransfer;
target.dispatchEvent(evt);
};
var DragNDrop=function(src,tgt) {
src = document.getElementById(src);
tgt = document.getElementById(tgt);
emit('dragstart',src);
emit('dragenter',tgt);
emit('dragover',tgt);
emit('drop',tgt);
emit('dragend',src);
return true;
}
drag-n-drop.机器人
*** Settings ***
Library SeleniumLibrary
Library OperatingSystem
Suite Setup Open_Browser ${url} Chrome
Suite Teardown Close Browser
*** Variables ***
${URL} = https://html5demos.com/drag/
*** Test Cases ***
Make Test
${js} Get File drag-n-drop.js
${result} Execute Javascript ${js}; return DragNDrop("two", "bin");
Capture Page Screenshot
Sleep 1
我试过上面的答案,但它们不适用于我的用例,selenium 的内置功能也不适用。相反,我实现了自己的可重复使用的拖放关键字。这甚至适用于 angular js/react js 元素中没有名为 draggable set 的属性的情况。
Drag And Drop
[Arguments] ${src} ${intermediate} ${tgt}
Wait Until Keyword Succeeds ${ATTEMPTS} ${LARGER_TIMEOUT} Mouse Down ${src}
Wait Until Keyword Succeeds ${ATTEMPTS} ${LARGER_TIMEOUT} Mouse Over ${intermediate}
Wait Until Keyword Succeeds ${ATTEMPTS} ${LARGER_TIMEOUT} Mouse Over ${tgt}
Wait Until Keyword Succeeds ${ATTEMPTS} ${LARGER_TIMEOUT} Mouse Up ${tgt}
使用 Wait until keyword succeed 有助于在很大程度上保证进程不会失败。您可以找到它的文档 here。拖放实际上是按下鼠标移动位置并释放它。我还使用了一个中间位置来处理可能会失败但没有必要的情况。
要调用该函数,只需使用类似这样的东西 -
Drag And Drop ${XPATH1} ${XPATH2} ${XPATH3}
试试看
Drag And Drop Element
[Arguments] ${src} ${tgt}
Wait Until Keyword Succeeds ${ATTEMPTS} ${LARGER_TIMEOUT} Mouse Down ${src}
Sleep 1s
Wait Until Keyword Succeeds ${ATTEMPTS} ${LARGER_TIMEOUT} Mouse Out ${src}
Sleep 1s
Capture Page Screenshot
Wait Until Keyword Succeeds ${ATTEMPTS} ${LARGER_TIMEOUT} Mouse Over ${tgt}
Sleep 1s
Wait Until Keyword Succeeds ${ATTEMPTS} ${LARGER_TIMEOUT} Mouse Up ${tgt}
Sleep 1s
我正在测试网络应用程序(使用 RobotFramework 和 Selenium2Library),其中有几个点需要一些拖放操作。我尝试了 Drag And Drop 关键字,但它无法正常工作。
由于无法通过生产应用程序,我使用下面的页面重现了问题: https://html5demos.com/drag/
我的代码是:
*** Settings ***
Library Selenium2Library
*** Variables ***
${URL} = https://html5demos.com/drag/
*** Test Cases ***
Prepare Browser
Open_Browser ${url} browser=chrome
Maximize Browser Window
Make Test
#Drag And Drop //*[@id="one"] //*[@id="bin"]
#Drag And Drop //*[@id="two"] //*[@id="bin"]
Capture Page Screenshot
Sleep 1
Close All
Close Browser
已尝试使用 Python 2.7 和 3.6。
我得到的输出是 测试显示为通过 ,但我看不到拖放操作的任何实际结果(在我的生产应用程序和上面链接的示例页面中) . Screenshot of drag and drop test results
当我查看测试期间浏览器中发生的情况时,我注意到该对象变得 可拖动(引号 "drag me" 添加在括号中)但测试代表记录时间。当鼠标光标移动时,测试继续进行上述int PASS,但没有实际效果。
在最新的 Chrome、Firefox、IE 上试过。还尝试使用关键字 Mouse Down、Mouse Over、Mouse Up,但结果相同。
这是执行报告的日志截图: Execution report screenshot
我将不胜感激任何帮助或解决方法以正确完成它。
从 [so] 上的其他帖子来看,此功能似乎效果不佳。出于这个原因,大多数答案都包含使用 JavaScript 来创建解决方案的建议。我已将此
drag-n-drop.js
var dataTransfer=
{
dropEffect:'',
effectAllowed:'all',
files:[],
items:{},
types:[],
setData:function(format,data)
{
this.items[format]=data;
this.types.push(format);
},
getData:function(format)
{
return this.items[format];
},
clearData:function(format){}
};
var emit=function(event,target)
{
var evt=document.createEvent('Event');
evt.initEvent(event,true,false);
evt.dataTransfer=dataTransfer;
target.dispatchEvent(evt);
};
var DragNDrop=function(src,tgt) {
src = document.getElementById(src);
tgt = document.getElementById(tgt);
emit('dragstart',src);
emit('dragenter',tgt);
emit('dragover',tgt);
emit('drop',tgt);
emit('dragend',src);
return true;
}
drag-n-drop.机器人
*** Settings ***
Library SeleniumLibrary
Library OperatingSystem
Suite Setup Open_Browser ${url} Chrome
Suite Teardown Close Browser
*** Variables ***
${URL} = https://html5demos.com/drag/
*** Test Cases ***
Make Test
${js} Get File drag-n-drop.js
${result} Execute Javascript ${js}; return DragNDrop("two", "bin");
Capture Page Screenshot
Sleep 1
我试过上面的答案,但它们不适用于我的用例,selenium 的内置功能也不适用。相反,我实现了自己的可重复使用的拖放关键字。这甚至适用于 angular js/react js 元素中没有名为 draggable set 的属性的情况。
Drag And Drop
[Arguments] ${src} ${intermediate} ${tgt}
Wait Until Keyword Succeeds ${ATTEMPTS} ${LARGER_TIMEOUT} Mouse Down ${src}
Wait Until Keyword Succeeds ${ATTEMPTS} ${LARGER_TIMEOUT} Mouse Over ${intermediate}
Wait Until Keyword Succeeds ${ATTEMPTS} ${LARGER_TIMEOUT} Mouse Over ${tgt}
Wait Until Keyword Succeeds ${ATTEMPTS} ${LARGER_TIMEOUT} Mouse Up ${tgt}
使用 Wait until keyword succeed 有助于在很大程度上保证进程不会失败。您可以找到它的文档 here。拖放实际上是按下鼠标移动位置并释放它。我还使用了一个中间位置来处理可能会失败但没有必要的情况。
要调用该函数,只需使用类似这样的东西 -
Drag And Drop ${XPATH1} ${XPATH2} ${XPATH3}
试试看
Drag And Drop Element
[Arguments] ${src} ${tgt}
Wait Until Keyword Succeeds ${ATTEMPTS} ${LARGER_TIMEOUT} Mouse Down ${src}
Sleep 1s
Wait Until Keyword Succeeds ${ATTEMPTS} ${LARGER_TIMEOUT} Mouse Out ${src}
Sleep 1s
Capture Page Screenshot
Wait Until Keyword Succeeds ${ATTEMPTS} ${LARGER_TIMEOUT} Mouse Over ${tgt}
Sleep 1s
Wait Until Keyword Succeeds ${ATTEMPTS} ${LARGER_TIMEOUT} Mouse Up ${tgt}
Sleep 1s