Постановка задачи: функция перетаскивания из класса java Селена возвращает исключение org.openqa.selenium.JavascriptException: TypeError: $ не является функцией
В несколькихНа форумах было предложено использовать js, доступную в расположении ниже, для выполнения перетаскивания html5 в Селене Java, и следовали тем же шагам, но привели к вышеуказанной ошибке.
Selenium 3.141 Chrome 76
Функция drag_drop_ определена в файле drag_drop_helper.js, как показано ниже
js ссылка: https://gist.github.com/rcorreia/2362544#file-drag_and_drop_helper-js
(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);
Ниже строк кодачтение файла js и запуск функции перетаскивания html5, определенной в файле js
String js_filepath = "C:/test/drag_and_drop_helper.js";
String java_script = "";
String text;
BufferedReader input = new BufferedReader(new FileReader(js_filepath));
StringBuffer buffer = new StringBuffer();
while ((text = input.readLine()) != null)
buffer.append(text + " ");
java_script = buffer.toString();
WebElement source1 = driver.findElement(By.cssSelector("span.object-card-value[title=test]"));
WebElement dest1 = driver.findElement(By.cssSelector("div[data-field-name='references']"));
java_script = java_script + "$(arguments[0]).simulateDragDrop({dropTarget:arguments[1]});";
((JavascriptExecutor) driver).executeScript(java_script, source1, dest1);
Результат: элементы идентифицированы правильно, файл js также читается, но не может вызвать перетаскивание с ошибкой Ошибка типа: $ is notфункция
Статус 1:
@ pcalkins Спасибо. Я пробовал согласно вашему предложению, но в браузерах Chrome и FF не происходит никакого действия перетаскивания.
Разница лишь в том, что я пытаюсь пройти с помощью селектора CSS, поскольку у меня нет идентификатора. элементы todrag и todrop выделяются правильно. Не генерируются исключения, но действие перетаскивания не происходит.
var toDrag =document.querySelectorAll(\"span.object-card-value[title='test']\"); var toDrop = document.querySelectorAll(\" div[data-field-name='references']\");";
((JavascriptExecutor)driver).executeScript(simulateFunction + "simulateDragDrop(toDrag, toDrop);"); //also tried with queryselector
Update2 разметка, как показано ниже
перетаскивание разметки
<ul class="object-list drop-target"> changes to object-list drop-target active drag-over, drag-over triggers?
<li class="chooser add"><div class="autocomplete">
<div class="autocomplete-searchbox" tabindex="1">
<input placeholder="Drop here " class="autocomplete-input autocomplete-single-select form-control" size="30" style="width: 100%;" type="text">
<span class="autocomplete-reset fonticon fonticon-clear"></span>
</div>
<div class="autocomplete-suggests">
<div class="autocomplete-suggests-scroll scroller scroller-root" style="overflow: hidden;">
<div class="no-native-scrollbars scroller-content" style="right: -16px; bottom: -16px; padding-right: 16px; padding-bottom: 16px;">
<ul tabindex="1" class="scroller-shift">
</ul></div></div></div></div>
<button class="btn"><span class="fonticon fonticon-search"></span></button></li>
<li class="object-card has-image" data-field-name="item" data-type="Document" data-id="16C31E069B1C00009555C15DB7CC0B00" data-hasfiles="TRUE">
<span class="draggable-item" draggable="true">
<span class="thumbnail object-image">
<img draggable="false" oncontextmenu="return false" src="http://test.com" title="test">
</span>
<span data-field-name="display-value"><span class="object-card-value" oncontextmenu="return false" title="test" style="background: yellow; border: 2px solid red;">test</span></span>
</span>
<span class="actions">
<button class="btn">
<span class="fonticon fonticon-down-open" data-field-name="deliverables" title=""></span>
</button>
</span>
</li>
WebElement source1 = driver.findElement(By.cssSelector("span.object-card-value[title='test']"));
drop markup
<div id="card0">
<div class="card-content" data-id="16C31E069B1C00008B21C15D91F10B00" oncontextmenu="return false">
<div class="card-title">Context</div>
<div class="card-properties">
<div class="card-details ">
<div class="thumbnail type">
<span class="task"></span>
</div></div></div></div></div></div>
WebElement dest1 = driver.findElement(By.id("card0"));
Как только пользователь перемещает элемент перетаскивания, возникает событие перетаскивания, которое изменяет drop-target объекта-списка на object-list drop-target drag-over