Невозможно перетащить элемент из в с помощью методов класса selenium Actions

#html #selenium #selenium-webdriver

#HTML #selenium #selenium-webdriver

Вопрос:

Я пытаюсь автоматизировать вариант использования, в котором я должен иметь возможность перетаскивать элемент, заключенный в элемент «ul> li», в целевое местоположение, которое является элементом «td» под таблицей. Мой код выглядит следующим образом

 WebElement source = driver.findElement(By.xpath("//div[@id='items']/ul/li[1]");
WebElement target = driver.findElement(By.xpath("//div[@id='cart']/table/tbody/tr[7]/td[3]");

Actions actions = new Actions(driver);
actions.clickAndHold(source)
   .moveToElement(target)
   .release(target)
   .build()
       .perform();
  

Я также пробовал делать паузу между каждым шагом, добавляя

 actions.moveToElement(source)
.pause(Duration.ofSeconds(2))
.clickAndHold(source)
.pause(Duration.ofSeconds(2))
.moveByOffset(1,0)
.moveToElement(target)
.moveByOffset(1, 0)
.pause(Duration.ofSeconds(2))
.release()
.pause(Duration.ofSeconds(2))
    .build()
    .perform();
  

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

Я не уверен, связана ли проблема с локатором или кодом действий.

Я заметил такое же поведение, если я использовал actions.DragAndDrop(источник, цель);

Чтобы имитировать это, я попытался выполнить аналогичный код против http://jqueryui.com/droppable / и это работает нормально. Мой код для этого веб-сайта выглядит следующим образом

 driver.get("http://www.jqueryui.com/droppable/");
driver.manage().window().maximize();
driver.switchTo().frame(driver.findElement(By.className("demo-frame")));
WebElement drag = driver.findElement(By.xpath("//*[@id='draggable']"));
WebElement drop = driver.findElement(By.xpath("//*[@id='droppable']"));
Actions action = new Actions(driver);
//action.dragAndDrop(drag, drop).build().perform(); //This is working
action.clickAndHold(drag)
      .moveToElement(drop)
      .release(drop)
      .build()
      .perform();  // This is working
  

Единственное различие, которое я заметил между этим примером и первым, заключается в расположении элементов и в том, как они заключены. В первом случае перетаскиваемый элемент находится в ul > li , а целевым местоположением является элемент td под таблицей.

Где, как в примере в jqueryui, оба идентифицируются по идентификатору.

Кроме того, я подтверждаю, что xpath, используемые для определения источника и цели в предыдущем примере, верны, поскольку я вижу, что они выделяются при проверке с помощью инструментов разработчика Chrome.

Не могли бы вы подсказать, что можно сделать, чтобы исправить эту проблему?

Спасибо

Комментарии:

1. Можете ли вы поделиться URL-адресом, если он не является частным?

Ответ №1:

  driver = new ChromeDriver();
 driver.get("http://www.jqueryui.com/droppable/");
 driver.manage().window().maximize();
 driver.switchTo().frame(driver.findElement(By.className("demo-frame")));
  

//Сначала мы захватываем 1-й элемент, который нам нужно перетащить в переменную «From».

 WebElement From = driver.findElement(By.xpath("//*[@id='draggable']"));
  

// Во-вторых, мы фиксируем 2-й элемент, на который нам нужно перенести 1-й элемент в переменную «To».

 WebElement To = driver.findElement(By.xpath("//*[@id='droppable']"));
  

// В-третьих, мы создаем объект класса Actions, поскольку мы используем методы класса Actions.

    Actions act=new Actions(driver);
   act.dragAndDrop(From, To).build().perform();
  

Для перетаскивания элемента мы используем метод DragAndDrop класса Actions и передаем параметры в качестве первого элемента (Sourcelocator) «From» и второго элемента (Destinationlocator) «To». Строка ниже перетащит 1-й элемент и переместит его на 2-й элемент.

Комментарии:

1. Это именно то, что я пробовал. Как я уже упоминал, у меня нет проблем с реализацией этого механизма против droppable в jqueryui. У меня проблемы с другим проектом аналогичного использования.

2. Третий вариант сработал для меня.. Спасибо!

Ответ №2:

Я столкнулся с такой проблемой, продолжайте пробовать разные способы, это работает для меня:

 Action dragAndDrop = builder.clickAndHold(src).moveToElement(trg).release(trg).build(); 
dragAndDrop.perform();
Thread.sleep(3000);
new Actions(oWebDriver).moveToElement(src).build().perform();
Thread.sleep(3000);
new Actions(oWebDriver).moveToElement(trg).click().build().perform();