#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();