【问题标题】:RobotFramework: Drag And Drop Selenium2 Keyword seems not to workRobotFramework:拖放 Selenium2 关键字似乎不起作用
【发布时间】:2018-09-09 07:14:43
【问题描述】:

我正在测试网络应用程序(使用带有 Selenium2Library 的 RobotFramework),其中需要一些拖放操作。我试过拖放关键字,但它不能正常工作。

由于我无法通过生产应用程序,我使用以下页面重新创建了问题: 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

当我在测试期间查看浏览器中发生的情况时,我注意到该对象变得可拖动(括号中添加了引号“拖动我”)但测试持续了一段时间。当鼠标光标移动时,测试继续上面提到的int PASS,但没有实际效果。

在最新的 Chrome、Firefox、IE 上试用。还尝试使用关键字 Mouse DownMouse OverMouse Up,但结果相同。

这是执行报告中的日志截图: Execution report screenshot

如果有任何帮助或解决方法以使其正确完成,我将不胜感激。

【问题讨论】:

    标签: selenium-webdriver robotframework drag selenium2library


    【解决方案1】:

    从 [so] 上的其他帖子看来,此功能不能很好地工作。出于这个原因,大多数答案都包含使用 JavaScript 创建解决方案的建议。我已将 SO answer 中的示例改编为与 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.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
    

    【讨论】:

    • 我仍然需要一些帮助,因为我还不太了解 JavaScript。如果我想作为 DragNDrop 函数的参数是 xpaths 而不是 div id,如何更改上面的代码。在我测试的应用程序中,我没有像“id”这样的属性,我使用 xpath 定位器策略(通常我使用 div 类和 text())。在上面的示例中,当我想通过 xpath=//*[@id="one"] 定位源 div 并通过 xpath=[@id="bin"] 定位目标时,我得到 ERROR: WebDriverException: Message: unknown error: Cannot读取 null 的属性“dispatchEvent”。如何更改 JavaScript 以使其更通用?
    • 我有这样的 xpath: SOURCE:
      Source Name
      DESTINATION:
      Drop here
      你会如何尝试获得这些?
    • 这确实是一个新问题。此外,之前在 Stack Overflow 上提出的一个问题是,在 JavaScript Cross xPath 上进行简单搜索会得到许多结果,这些结果应该可以让您制定适合自己的解决方案。
    • 如何使用 xpath 查找定位器的解决方法是在上面的脚本中添加以下函数并在 DragNDrop 函数中调用它。 function getElementByXpath(path) {return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;} 在 DragNDrop 中:src = getElementByXpath(src) tgt = getElementByXpath(tgt)
    【解决方案2】:

    我尝试了上述答案,但它们不适用于我的用例,硒的内置功能也不适用。相反,我实现了自己的可重复使用的拖放关键字。这甚至适用于 angular js/react js 元素中没有称为可拖动集的属性的场景。

    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 关键字成功有助于在很大程度上保证进程不会失败。你可以找到它的文档here。拖放所做的实际上是按下鼠标向下移动位置并释放它。我还使用了一个中间位置来处理它可能失败但没有必要的情况。

    要调用函数,只需使用类似这样的东西 -

    Drag And Drop   ${XPATH1}  ${XPATH2}  ${XPATH3}
    

    【讨论】:

      【解决方案3】:

      试试看

       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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-27
        • 1970-01-01
        • 2020-04-05
        • 1970-01-01
        • 1970-01-01
        • 2013-11-13
        • 1970-01-01
        相关资源
        最近更新 更多