RobotFramework:拖放Selenium2关键字似乎不起作用

时间:2018-03-30 08:37:52

标签: selenium-webdriver robotframework drag selenium2library

我正在测试网络应用程序(使用带有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

感谢任何帮助或解决方法,让它正确完成。

3 个答案:

答案 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