2016-09-11 2 views
10

Я пытаюсь перетащить элемент в другой элемент, используя 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

Вы пытаетесь это сделать для HTML5? – Grasshopper

+0

Начинается с на странице Просмотр исходного кода. Так что да, это html5 страница. – Naseem

+2

Посмотрите на это - http://stackoverflow.com/questions/29381233/how-to-simulate-html5-drag-and-drop-in-selenium-webdriver. Кто-то даже создал github с соответствующим java-кодом. – Grasshopper

ответ

0

В коде 1: Не вызывая выполнения() метод, он должен быть

Действия строитель = новые действия (_controls.getDriver());

builder.dragAndDrop (sourceelement, destelement) .perform();

В своем коде 2: Я не думаю, что вам нужно вызвать высвобождение()

Пожалуйста, поиск similar question с перед публикацией.

+0

Пожалуйста, сообщите нам об этом, что работает .. – FayazMd

+0

После внесения необходимых изменений в Code 1 и Code 2, он все еще не работает. Также я много исследовал функции перетаскивания, и именно так я смог найти столько кодов. Когда никто из них не работал, я только что отправил свой вопрос. Спасибо :) – Naseem

0

Возможно, вам захочется проверить, включен ли веб-элемент или отображается перед выполнением желаемого действия над ним. Вы можете дать ему попробовать с ниже код

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(); 
    } 
} 
+0

Спасибо Nandesh, но элементы включены. Пробовал с приведенным выше кодом, и он работает без каких-либо ошибок, но не перетаскивает – Naseem

+0

@ Naseem, не могли бы вы поделиться версией веб-редактора Selenium, источника страницы, браузера? Предполагая, что веб-элемент, с которым вы взаимодействуете, поддерживает операции перетаскивания. –

+0

Я использую версию Seleniun как 2.53.0 и браузер как IE. К сожалению, вы не сможете поделиться источником страницы здесь. – Naseem

0

Я хотел бы предложить вам попробовать следующее решение:

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 перетащить элемент

0

Я хотел бы предложить вы можете использовать Touch Action для выполнения перетаскивания.

Point coordinates1 = sourceelement.getLocation(); 
Point coordinates2 = destelement.getLocation(); 
TouchActions builder = new TouchActions(driver); 
builder.longPress(coordinates1) 
     .move(coordinates2).release(coordinates2).perform(); 
0

У меня есть лицо аналогичной проблемой пути назад, я использовал 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"); 
} 

Вы можете сослаться на ссылку here

Смежные вопросы