无法将<li>下的元素拖放到使用Selenium Actions类方法

时间:2019-04-22 03:27:06

标签: html5 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(source,target);,我会注意到相同的行为

为了模拟这一点,我尝试对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中的示例中,两者均由ID标识。

此外,我确认前一个示例中用于标识源和目标的xpath正确,因为在使用Chrome开发人员工具进行验证时,我可以看到它们被突出显示。

请问您可以建议如何解决此问题?

谢谢

2 个答案:

答案 0 :(得分:0)

我面对这样的问题,继续尝试不同的方法,这对我有用:

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

答案 1 :(得分:0)

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

//首先,我们捕获需要拖动变量“ From”的第一个元素。

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

//第二,我们捕获需要在变量“ To”中放置第一个元素的第二个元素。

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

//第三,我们使用Actions类的方法来创建Actions类的对象。

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

对于拖放元素,我们使用Actions类的dragAndDrop方法,并将参数作为第一个元素(Sourcelocator)“发自”(From)和第二个元素(Destinationlocator)“ To”进行传递。在下面的行中,将第一个元素拖放到第二个元素上。