我正在测试网络应用程序(使用带有Selenium2Library的RobotFramework),其中需要在几个点进行一些拖放操作。我尝试了拖放关键字,但它无法正常工作。
由于我无法通过生产应用程序,因此我使用以下页面重新创建了问题: https://html5demos.com/drag/
我的代码是:
$('#submit-form').submit(function(e) {
e.preventDefault();
var formData = new FormData(this);
var url = "upload-files.php";
formData.forEach(function(entry) {
if (entry instanceof File) {
var fileForm = new FormData()
fileForm.append('resume', entry)
$.ajax({
url: url,
type: 'post',
data: fileForm,
success: function(response) {
alert(response);
},
cache: false,
contentType: false,
processData: false
})
}
})
})
使用Python 2.7和3.6进行过尝试。
我得到的输出测试显示为PASS ,但我看不到拖放动作的任何实际结果(在我的生产应用和上面链接的示例页面中都有)。 Screenshot of drag and drop test results
当我在测试期间查看浏览器中发生的事情时,我注意到该对象变为 draggable (引用“拖我”在括号中添加)但是测试代表了一个日志时间。当移动鼠标光标时,测试继续上面提到的int PASS,但没有实际效果。
尝试使用最新的Chrome,Firefox,IE。还尝试使用关键字鼠标按下,鼠标悬停,鼠标悬停,但效果相同。
以下是执行报告中的日志截图: Execution report screenshot
感谢任何帮助或解决方法,让它正确完成。
答案 0 :(得分:3)
从[so]上的其他帖子看来,此功能效果不佳。因此,大多数答案都包含使用JavaScript创建解决方案的建议。我已经调整了这个close()
中的示例来使用Robot Framework:
<强>拖动正drop.js 强>
var dataTransfer=
{
dropEffect:'',
effectAllowed:'all',
files:[],
items:{},
types:[],
setData:function(format,data)
{
this.items[format]=data;
this.types.append(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;
}
<强>拖动正drop.robot 强>
*** 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
答案 1 :(得分:1)
我尝试了上面的答案,但它们不适用于我的用例,硒的内置功能也不适用。相反,我实现了自己的可重复使用的拖放关键字。即使在有角度的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}
使用“等待直到”关键字成功有助于在很大程度上保证过程不会失败。您可以找到其文档here。拖放的作用实际上是按下鼠标并向下移动位置并释放它。我还使用了一个中间位置来处理可能会失败但并非必需的情况。
要调用该函数,只需使用类似这样的内容-
Drag And Drop ${XPATH1} ${XPATH2} ${XPATH3}
答案 2 :(得分:1)
尝试一下
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