Почему перетаскивание не работает в Selenium Webdriver?
Я пытаюсь перетащить элемент в другой элемент, используя Selenium WebDriver, но он не работает. Я пробовал все решения, которые я могу найти в Интернете, но ни одно из решений, похоже, не работает для меня.
WebElement sourceelement = driver.findElement(By.cssSelector("XXX"));
WebElement destelement = driver.findElement(By.cssSelector("YYY"));
Code1: -
Actions builder = new Actions( _controls.getDriver());
builder.dragAndDrop(sourceelement, destelement);
Код2: -
Actions builder = new Actions(_controls.getDriver());
Action dragAndDrop =
builder.clickAndHold(sourceelement).moveToElement(destelement).release(destelement).build();
Thread.sleep(2000);
dragAndDrop.perform()
Code3: -
Point coordinates1 = sourceelement.getLocation();
Point coordinates2 = destelement.getLocation();
Robot robot = new Robot();
robot.mouseMove(coordinates1.getX(), coordinates1.getY());
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseMove(coordinates2.getX(), coordinates2.getY());
robot.mouseRelease(InputEvent.BUTTON1_MASK);
Thread.sleep(2000);
code4: -
final String java_script =
"var src=arguments[0],tgt=arguments[1];var dataTransfer={dropEffe" +
"ct:'',effectAllowed:'all',files:[],items:{},types:[],setData:fun" +
"ction(format,data){this.items[format]=data;this.types.append(for" +
"mat);},getData:function(format){return this.items[format];},clea" +
"rData:function(format){}};var emit=function(event,target){var ev" +
"t=document.createEvent('Event');evt.initEvent(event,true,false);" +
"evt.dataTransfer=dataTransfer;target.dispatchEvent(evt);};emit('" +
"dragstart',src);emit('dragenter',tgt);emit('dragover',tgt);emit(" +
"'drop',tgt);emit('dragend',src);";
((JavascriptExecutor)_controls.getDriver()).executeScript(java_script, sourceelement, destelement);
Thread.sleep(2000);
Ни один из приведенных выше кодов не работает для меня. Все вышеперечисленное работает без ошибок, но перетаскивание в приложении не происходит. Любой, кто имеет какое-либо другое решение? Спасибо.
Ответы
Ответ 1
В вашем коде 1:
Не вызывая метод execute()
это должно быть
Действия builder = new Actions (_controls.getDriver());
builder.dragAndDrop(sourceelement, destelement).perform();
В вашем коде 2: я не думаю, что вам нужно вызвать release()
Пожалуйста, ищите аналогичный вопрос перед публикацией.
Ответ 2
Возможно, вам захочется проверить, включен ли веб-элемент или отображается перед выполнением желаемых действий над ним. Вы можете попробовать с помощью кода ниже.
public void dragAndDrop(WebElement sourceElement, WebElement destinationElement) {
try {
if (sourceElement.isDisplayed() && destinationElement.isDisplayed()) {
Actions action = new Actions(driver);
action.dragAndDrop(sourceElement, destinationElement).build().perform();
} else {
System.out.println("Element was not displayed to drag");
}
} catch (StaleElementReferenceException e) {
System.out.println("Element with " + sourceElement + "or" + destinationElement + "is not attached to the page document "
+ e.getStackTrace());
} catch (NoSuchElementException e) {
System.out.println("Element " + sourceElement + "or" + destinationElement + " was not found in DOM "+ e.getStackTrace());
} catch (Exception e) {
System.out.println("Error occurred while performing drag and drop operation "+ e.getStackTrace());
}
}
public void dragAndDrop(WebElement sourceElement, WebElement destinationElement)
{
(new Actions(driver)).dragAndDrop(sourceElement, destinationElement).perform();
}
}
Ответ 3
Я предлагаю вам попробовать следующее решение:
WebElement sourceelement = driver.findElement(By.cssSelector("XXX"));
Locatable element = (Locatable)sourceelement ;
Point p= element.getCoordinates().inViewPort();
int sourceX=p.getX();
int sourceY=p.getY();
WebElement destelement = driver.findElement(By.cssSelector("YYY"));
Locatable elementTarget = (Locatable)destelement;
Point Target= elementTarget.getCoordinates().inViewPort();
int targetX=Target.getX();
int targetY=Target.getY();
Затем вы можете использовать Robot для перетаскивания элемента
Ответ 4
Я предлагаю вам использовать Touch Action для выполнения перетаскивания.
Point coordinates1 = sourceelement.getLocation();
Point coordinates2 = destelement.getLocation();
TouchActions builder = new TouchActions(driver);
builder.longPress(coordinates1)
.move(coordinates2).release(coordinates2).perform();
Ответ 5
У меня проблемы с аналогичной проблемой назад, я использовал dragAndDropBy для перемещения слайдера, но это не сработало для меня, но позже я нашел помощь и ниже фрагмента для моего рабочего кода:
public static void slider(){
x=10;
WebElement slider = driver.findElement(By.id("slider"));
int width=slider.getSize().getWidth();
Actions move = new Actions(driver);
move.moveToElement(slider, ((width*x)/100), 0).click();
move.build().perform();
System.out.println("Slider moved");
}
Вы можете ссылаться на ссылку здесь
Ответ 6
Вы можете попробовать выполнить следующий javascript для выполнения перетаскивания
WebDriver _driver;
WebElement _sourceElement = _driver.findElement(<source>);
WebElement _targetElement = _driver.findElement(<source>);
JavascriptExecutor _js = (JavascriptExecutor) _driver;
_js.executeScript("$(arguments[0]).simulate('drag-n-drop',{dragTarget:arguments[1],interpolation:{stepWidth:100,stepDelay:50}});", _sourceElement, _targetElement);
Более подробную информацию вы найдете здесь.
Он отлично работает для всех браузеров и устройств.
Ответ 7
Это работает на меня:
Actions act = new Actions(driver);
act.moveToElement(element, (elementWidth / 2), elementHeight / 2).clickAndHold().build().perform();
act.moveToElement(dest, (destWidth / 2) , (destHeight / 2)).release().build().perform();
В некоторых версиях селена иногда появляются ошибки. Убедитесь, что вы используете последний и играете с нажатием. Было бы проще, если вы можете отправить ссылку на то, что вы пытаетесь перетащить/выбросить
Ответ 8
Я пробовал кучу обходных решений, кажется, что это работает для меня, используя macOS и chromedriver
public void dragAndDrop(WebElement source, WebElement target) throws AWTException {
new Actions(driver).dragAndDrop(source, target).release().build().perform();
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_ESCAPE);
robot.keyRelease(KeyEvent.VK_ESCAPE);
}
Ответ 9
Actions act = new Actions(driver);
WebElement source = driver.findElement(By.id("XXX"));
WebElement destination = driver.findElement(By.id("XXX"));
Action dragAndDrop =act.moveToElement(source,destination).build().perform();