Selenium webdriver 机器人框架:拖放Selenium2关键字似乎不起作用
我正在测试web应用程序(使用带Selenium2Library的RobotFramework),其中需要在几个点执行一些拖放操作。我尝试了拖放关键字,但它不能正常工作 由于无法通过生产应用程序,我使用以下页面重新创建了问题: 我的代码是: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
*** 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)