我针对其运行的网站位于内部服务器上,因此无法提供链接,但是我可以发布一些单击“显示元素”时显示的相关代码。
有五个与此相关的元素:
此页面显示学生组,并允许用户在组之间拖动学生。每个组都有一个移动元素。棘手的部分是,仅当用户将学生元素拖到该组上时,任何给定组的“移动”按钮才会显示,而该学生并非来自该组。
目的是将学生转移到新的小组中,然后再移回原来的小组。
注意:学生XPath会在更改组时发生更改,我无法确认,但我相信移动按钮的XPath在隐藏和可见之间是不同的
我当前的代码:
IWebDriver driver = (IWebDriver)FeatureContext.Current["Driver"];
Actions builder = new Actions(driver);
IWebElement originalstudent = driver.FindElement(By.XPath("//*[@id=\"AMTeacherApp\"]/div/div/div[1]/div/div[3]/div/div/div[2]/div[2]/div[2]/div/div[3]/a[1]/div[1]/div"));
IWebElement originalClass = driver.FindElement(By.XPath("//*[@id=\"AMTeacherApp\"]/div/div/div[1]/div/div[3]/div/div/div[2]/div[2]/div[2]/div/div[1]"));
IWebElement newClass = driver.FindElement(By.XPath("//*[@id=\"AMTeacherApp\"]/div/div/div[1]/div/div[3]/div/div/div[2]/div[2]/div[3]/div[1]/div[1]"));
IWebElement originalMove = driver.FindElement(By.XPath("//*[@id=\"AMTeacherApp\"]/div/div/div[1]/div/div[3]/div/div/div[2]/div[2]/div[2]/div/div[2]/div[1]/div"));
IWebElement newMove = driver.FindElement(By.XPath("//*[@id=\"AMTeacherApp\"]/div/div/div[1]/div/div[3]/div/div/div[2]/div[2]/div[3]/div[1]/div[2]/div[1]/div"));
builder.ClickAndHold(originalstudent);
builder.MoveToElement(newClass);
builder.Release(newMove);
builder.Build().Perform();
IWebElement save = driver.FindElement(By.XPath("//*[@id=\"AMTeacherApp\"]/div/div/div[1]/div/div[3]/div/div/div[1]/div/div/button[2]"));
builder.Click(save);
builder.Build().Perform();
//assert group2 has 1 student and group 1 has 3 students
IWebElement newstudent = driver.FindElement(By.XPath("//*[@id=\"AMTeacherApp\"]/div/div/div[1]/div/div[3]/div/div/div[2]/div[2]/div[3]/div/div[3]/a/div[1]/div"));
builder.ClickAndHold(newstudent);
builder.MoveToElement(originalClass);
builder.Release(originalMove);
builder.Click(save);
builder.Build().Perform();
此代码不会移动任何元素,并且在尝试查找保存时会失败,因为未进行任何更改(鉴于没有任何移动,这是预期的)。
页面中的相关代码:
<div class="column small-5 filter">
<div class="row groups-header">
<!-- ngIf: !model.configData.groupingMode.autoRegroup -->
<div ng-if="!model.configData.groupingMode.autoRegroup" class="column small-8 ng-scope">
</div>
<!-- end ngIf: !model.configData.groupingMode.autoRegroup -->
<!-- ngIf: model.configData.groupingMode.autoRegroup -->
<div class="column small-4 left-delimiter no-regroup" ng-class="{'no-regroup' : !model.configData.groupingMode.autoRegroup}">
<button type="button" class="light" ng-click="model.addGroup()" ng-disabled="!model.canAddGroup()">Add group
</button>
</div>
</div>
<!-- ngRepeat: group in model.groupingData -->
<div class="group ng-scope" ng-repeat="group in model.groupingData">
******<div index="1" class="drop-outer" ui-on-drop="model.onDrop(group)" ui-drag-enter="model.dragOver(group)" ui-drag-leave="model.dragLeave(group)">
<div class="button radius group-btn" ng-style="{'background-color': group.color}" ng-click="model.toggleState(group)" ui-on-drop="model.onMoveDrop(group)"
ui-drag-enter="moveActive = true;model.autoScroll(el);" ui-drag-leave="moveActive = false;" style="background-color: rgb(0, 155, 159);">
<div class="left group-label ng-binding">Group 1 | 4
<span ng-show="group.students.length !== 1" class="">Students
</span>
<span ng-show="group.students.length === 1" class="ng-hide">Student
</span>
</div>
<div class="right group-collapser" ng-hide="group.students.length == 0">
<!-- ngIf: group.collapsed -->
<!-- ngIf: !group.collapsed -->
<span class="glyph-chevron-collapsed ng-scope" ng-if="!group.collapsed">
</span>
<!-- end ngIf: !group.collapsed -->
</div>
</div>
<div ng-show="group.showAddContainers" class="row drop-container ng-hide">
<div ui-on-drop="model.onMoveDrop(group)" class="column" ng-class="{'active':moveActive}">
**********<div class="move">Move
</div>
</div>
<div ui-on-drop="model.onCopyDrop(group)" class="column">
<div class="copy">Copy
</div>
</div>
</div>
<!-- ngIf: !group.collapsed -->
******<div class="row students slide-animation drag-elements ng-scope" ng-if="!group.collapsed">
<!-- ngRepeat: student in group.students -->
<a no-chrome-href="" title="AM2Paper S" alt="AM2Paper S" class="student-btn-cont fade-animation ng-scope" ng-repeat="student in group.students"
ui-draggable="true" on-drag-begin="model.dragStart(student, group)" drag="student" drag-class="student-btn-cont student-btn-cont-dragged"
on-drop-success="model.dropSuccessHandler($index,group)" draggable="true" style="">
<div ng-style="{'background-color': group.color}" class="radius column student-btn" style="background-color: rgb(0, 155, 159);">
************<div class="left student-label ng-isolate-scope" rl-display-name="" long-name="AM2Paper S" style="font-size: 9px;">AM2Paper S
</div>
</div>
<div class="dots dots-line">
</div>
</a>
<!-- end ngRepeat: student in group.students -->
<a no-chrome-href="" title="AMTest A" alt="AMTest A" class="student-btn-cont fade-animation ng-scope" ng-repeat="student in group.students"
ui-draggable="true" on-drag-begin="model.dragStart(student, group)" drag="student" drag-class="student-btn-cont student-btn-cont-dragged"
on-drop-success="model.dropSuccessHandler($index,group)" draggable="true" style="">
<div ng-style="{'background-color': group.color}" class="radius column student-btn" style="background-color: rgb(0, 155, 159);">
<div class="left student-label ng-isolate-scope" rl-display-name="" long-name="AMTest A" style="font-size: 11px;">AMTest A
</div>
</div>
<div class="dots dots-line">
</div>
</a>
<!-- end ngRepeat: student in group.students -->
<a no-chrome-href="" title="AMTestPaper A" alt="AMTestPaper A" class="student-btn-cont fade-animation ng-scope" ng-repeat="student in group.students"
ui-draggable="true" on-drag-begin="model.dragStart(student, group)" drag="student" drag-class="student-btn-cont student-btn-cont-dragged"
on-drop-success="model.dropSuccessHandler($index,group)" draggable="true" style="">
<div ng-style="{'background-color': group.color}" class="radius column student-btn" style="background-color: rgb(0, 155, 159);">
<div class="left student-label ng-isolate-scope" rl-display-name="" long-name="AMTestPaper A" style="font-size: 9px;">AMTestPaper...
</div>
</div>
<div class="dots dots-line">
</div>
</a>
<!-- end ngRepeat: student in group.students -->
<a no-chrome-href="" title="AM2Online S" alt="AM2Online S" class="student-btn-cont fade-animation ng-scope" ng-repeat="student in group.students"
ui-draggable="true" on-drag-begin="model.dragStart(student, group)" drag="student" drag-class="student-btn-cont student-btn-cont-dragged"
on-drop-success="model.dropSuccessHandler($index,group)" draggable="true" style="">
<div ng-style="{'background-color': group.color}" class="radius column student-btn" style="background-color: rgb(0, 155, 159);">
<div class="left student-label ng-isolate-scope" rl-display-name="" long-name="AM2Online S" style="font-size: 9px;">AM2Online S
</div>
</div>
<div class="dots dots-line">
</div>
</a>
<!-- end ngRepeat: student in group.students -->
</div>
<!-- end ngIf: !group.collapsed -->
<div ng-show="group.showRemoveContainers" class="row drop-container ng-hide">
<div class="column remove" ui-on-drop="model.onRemoveDrop(group)">
<div class="remove ng-binding">Remove from Group 1
</div>
</div>
</div>
</div>
<!-- ngIf: group.students.length == 0 -->
</div>
<!-- end ngRepeat: group in model.groupingData -->
<div class="group ng-scope" ng-repeat="group in model.groupingData">
******<div index="2" class="drop-outer" ui-on-drop="model.onDrop(group)" ui-drag-enter="model.dragOver(group)" ui-drag-leave="model.dragLeave(group)">
<div class="button radius group-btn" ng-style="{'background-color': group.color}" ng-click="model.toggleState(group)" ui-on-drop="model.onMoveDrop(group)"
ui-drag-enter="moveActive = true;model.autoScroll(el);" ui-drag-leave="moveActive = false;" style="background-color: rgb(109, 48, 146);">
<div class="left group-label ng-binding">Group 2 | 0
<span ng-show="group.students.length !== 1" class="">Students
</span>
<span ng-show="group.students.length === 1" class="ng-hide">Student
</span>
</div>
<div class="right group-collapser ng-hide" ng-hide="group.students.length == 0">
<!-- ngIf: group.collapsed -->
<!-- ngIf: !group.collapsed -->
<span class="glyph-chevron-collapsed ng-scope" ng-if="!group.collapsed">
</span>
<!-- end ngIf: !group.collapsed -->
</div>
</div>
<div ng-show="group.showAddContainers" class="row drop-container ng-hide">
<div ui-on-drop="model.onMoveDrop(group)" class="column" ng-class="{'active':moveActive}">
************<div class="move">Move
</div>
</div>
<div ui-on-drop="model.onCopyDrop(group)" class="column">
<div class="copy">Copy
</div>
</div>
</div>
<!-- ngIf: !group.collapsed -->
<div class="row students slide-animation drag-elements ng-scope" ng-if="!group.collapsed" style="">
<!-- ngRepeat: student in group.students -->
</div>
<!-- end ngIf: !group.collapsed -->
<div ng-show="group.showRemoveContainers" class="row drop-container ng-hide">
<div class="column remove" ui-on-drop="model.onRemoveDrop(group)">
<div class="remove ng-binding">Remove from Group 2
</div>
</div>
</div>
</div>
<!-- ngIf: group.students.length == 0 -->
<div class="empty-group-label ng-scope" ng-if="group.students.length == 0">
<span class="left">Drag student icons into this Group
</span>
<a href="" class="right" ng-click="model.removeGroup($index)">Delete this group
</a>
</div>
<!-- end ngIf: group.students.length == 0 -->
</div>
<!-- end ngRepeat: group in model.groupingData -->
</div>
星号标记相关元素。让我知道您是否需要上下文相关的其他信息。
Selenium的拖放操作在HTML5中效果不佳,因此我求助于使用jquery拖动元素。
我将这些用作参考:https :
//gist.github.com/rcorreia/2362544
http://elementalselenium.com/tips/39-drag-
and-drop
结果如下:
public void WhenAStudentIsMovedToANewGroup(string action, string student, string group)
{
WaitForAngular();
IWebDriver driver = (IWebDriver)FeatureContext.Current["Driver"];
/*
* Load a version of jQuery that we can access
*/
driver.Manage().Timeouts().SetScriptTimeout(TimeSpan.FromSeconds(10));
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteAsyncScript(loadJQuery, jQueryUrl);
string dragEntity = string.Format("[title=\"{0}\"]", student);
string target = string.Format("[ui-on-drop=\"model.onMoveDrop(group)\"]:contains({0}) ~ div > div .{1}", group, action);
string javaScriptString = string.Format("{0}$('{1}').simulateDragDrop({{ dropTarget: '{2}'}});", dragAndDropHelper, dragEntity, target);
//Execute the drag and drop against the HTML5
js.ExecuteScript(javaScriptString);
}
const string dragAndDropHelper = @"(function( $ ) {
$.fn.simulateDragDrop = function(options) {
return this.each(function() {
new $.simulateDragDrop(this, options);
});
};
$.simulateDragDrop = function(elem, options) {
this.options = options;
this.simulateEvent(elem, options);
};
$.extend($.simulateDragDrop.prototype, {
simulateEvent: function(elem, options) {
/*Simulating drag start*/
var type = 'dragstart';
var event = this.createEvent(type);
this.dispatchEvent(elem, type, event);
/*Simulating drop*/
type = 'drop';
var dropEvent = this.createEvent(type, {});
dropEvent.dataTransfer = event.dataTransfer;
this.dispatchEvent($(options.dropTarget)[0], type, dropEvent);
/*Simulating drag end*/
type = 'dragend';
var dragEndEvent = this.createEvent(type, {});
dragEndEvent.dataTransfer = event.dataTransfer;
this.dispatchEvent(elem, type, dragEndEvent);
},
createEvent: function(type) {
var event = document.createEvent(""CustomEvent"");
event.initCustomEvent(type, true, true, null);
event.dataTransfer = {
data: {
},
setData: function(type, val){
this.data[type] = val;
},
getData: function(type){
return this.data[type];
}
};
return event;
},
dispatchEvent: function(elem, type, event) {
if(elem.dispatchEvent) {
elem.dispatchEvent(event);
}else if( elem.fireEvent ) {
elem.fireEvent(""on""+type, event);
}
}
});
})(jQuery);";
const string loadJQuery = @"(function(jqueryUrl, callback) {
if (typeof jqueryUrl != 'string') {
jqueryUrl = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js';
}
if (typeof jQuery == 'undefined') {
var script = document.createElement('script');
var head = document.getElementsByTagName('head')[0];
var done = false;
script.onload = script.onreadystatechange = (function() {
if (!done && (!this.readyState || this.readyState == 'loaded'
|| this.readyState == 'complete')) {
done = true;
script.onload = script.onreadystatechange = null;
head.removeChild(script);
callback();
}
});
script.src = jqueryUrl;
head.appendChild(script);
}
else {
callback();
}
})(arguments[0], arguments[arguments.length - 1]);";
我试图使用Selenium的Action类将JQuery嵌套可排序列表中的源元素拖放到另一个元素。我使用了标准的dragAndDrop方法,并将其分解为clickAndHold、moveToElement和release,但这两种方法都不适用。我甚至尝试使用源元素内部的子元素来拖动,但结果是一样的。 当我运行脚本时,测试返回为已通过,因此我知道正在找到元素,并且选择器有效。Selenium认为拖放
问题内容: 我无法使用Python WebDriver绑定进行拖放。我正在Mac OS X上使用Google Chrome和Firefox。这里有一个线程,那里有人遇到类似问题。 我尝试使用: 您是否设法使Python WebDriver拖放工作? 问题答案: 为了给出更新的答案,我已经验证了它现在确实可以在Mac上运行。 参考
我试图执行拖放操作使用selenium网络驱动程序和红宝石,我尝试了以下选项: 选项1:基于http://rubydoc.info/gems/selenium-webdriver/0.0.28/Selenium/WebDriver/Element#drag_and_drop_on-实例法 备选案文2: 备选案文3: 当我或代码能够单击对象,即它能够找到元素,但由于某种原因不能拖放。以上拖放选项都不
本文向大家介绍如何在Selenium中进行拖放动作?,包括了如何在Selenium中进行拖放动作?的使用技巧和注意事项,需要的朋友参考一下 我们可以借助Actions类在Selenium中执行拖放动作。为了执行拖放运动,我们将使用dragAndDrop(源,目标)方法。最后,使用.perform()执行所有步骤。 示例
在本节中,您将学习如何在Selenium WebDriver中执行像拖放这样的复杂操作。 在继续本节之前,先了解一些有关拖放操作的概念。 Selenium WebDriver拖放操作 要执行复杂的用户交互,例如拖放,在Selenium WebDriver中有一个类。 使用类,首先构建一系列复合事件,然后使用Action(一个代表单个用户交互的接口)执行它。 在这里使用的类的一些方法是 - - 单击
我正在使用本机拖放html5 api开发拖放界面。我们已经在其他部分使用了jQuery拖动,但是它在这个特定部分的表现很差,所以我们使用原始的JavaScript。 本质上,标记看起来像这样... 我为“dragstart”创建一个addEventListener并运行以下函数 它将我的类完美地应用于原始元素,但我似乎不能移动原始元素。浏览器创建克隆/幽灵图像...我看到你可以创建自己的图像显示,