Selenium webdriver 机器人框架:拖放Selenium2关键字似乎不起作用

Selenium webdriver 机器人框架:拖放Selenium2关键字似乎不起作用,selenium-webdriver,robotframework,drag,selenium2library,Selenium Webdriver,Robotframework,Drag,Selenium2library,我正在测试web应用程序(使用带Selenium2Library的RobotFramework),其中需要在几个点执行一些拖放操作。我尝试了拖放关键字,但它不能正常工作 由于无法通过生产应用程序,我使用以下页面重新创建了问题: 我的代码是: *** Settings *** Library Selenium2Library *** Variables *** ${URL} = https://html5demos.com/drag/ *** Test Cases *** Prepar

我正在测试web应用程序(使用带Selenium2Library的RobotFramework),其中需要在几个点执行一些拖放操作。我尝试了拖放关键字,但它不能正常工作

由于无法通过生产应用程序,我使用以下页面重新创建了问题:

我的代码是:

*** 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
我已经尝试过使用Python2.7和3.6

我得到的输出是测试,显示为PASS,但我看不到拖放操作的任何实际结果(在我的生产应用程序和上面链接的示例页面中)。

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

在最新的Chrome、Firefox、IE上试用过。也试用了关键字鼠标向下鼠标上方鼠标向上,但效果相同

以下是执行报告中日志的屏幕截图:


我将非常感谢任何帮助或解决方法,以便正确完成此功能。

从[so]上的其他帖子中可以看出,此功能运行得不太好。因此,大多数答案都包含使用JavaScript创建解决方案的建议。我已将本文中的示例改编为Robot Framework:

拖放.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;
}           
拖放式机器人

*** 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

我尝试了上述答案,但它们不适用于我的用例,硒的内置功能也不适用。相反,我实现了自己的可重用拖放关键字。这甚至适用于在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关键字successful有助于在很大程度上保证流程不会失败。你可以找到它的文档。拖放所做的就是按鼠标向下移动位置并释放它。另外,我还使用了一个中间位置来处理可能失败但不必要的情况

要调用该函数,只需使用如下内容-

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

我仍然需要一些帮助,因为我还不太懂JavaScript。如果我希望DragNDrop函数的参数是XPath而不是div id,那么如何更改上面的代码。在我测试的应用程序中,我没有像“id”这样的属性,我使用xpath定位器策略(通常使用div class和text()。在上面的示例中,当我想通过xpath=/*[@id=“one”]定位源div,通过xpath=[@id=“bin”]定位目标div时,我得到错误:WebDriverException:消息:未知错误:无法读取null的属性“dispatchEvent”。如何更改JavaScript以在更通用的环境中使用?我有这样的xpath:SOURCE:SOURCE Name DESTINATION:Drop here您将如何尝试获取这些JavaScript?这确实是一个新问题。此外,以前也有人问过这样一个问题,在上进行简单搜索会得到大量结果,您可以据此制定一个适合自己的解决方案。如何使用xpath查找定位器的解决方法是在上面的脚本中添加以下函数,并在DragNDrop函数中调用它<代码>函数getElementByXpath(path){return document.evaluate(path,document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue;}在DragNDrop中:
src=getElementByXpath(src)tgt=getElementByXpath(tgt)