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 DownMouse OverMouse 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