我正在尝试自动化一个用例,在这种情况下,我应该能够将由“ 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开发人员工具进行验证时,我可以看到它们被突出显示。
请问您可以建议如何解决此问题?
谢谢
答案 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”进行传递。在下面的行中,将第一个元素拖放到第二个元素上。