以下代码用于使用WebDriver
测试拖放功能。我面对代码的麻烦在于它无法检测到XPath。
public class draganddrop
{
public static void main(String[] args) throws InterruptedException
{
// opening site for practicing user interaction by mouse using webdriver and action class
WebDriver driver = new ChromeDriver();
String URL = "http://www.dhtmlx.com/docs/products/dhtmlxTree/index.shtml";
driver.get(URL);
// It is always advisable to Maximize the window before performing DragNDrop action
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10000, TimeUnit.MILLISECONDS);
WebElement From = driver.findElement(By.xpath(".//*[@id='treebox1']/div/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td[2]/table/tbody/tr[1]/td[4]/span"));
WebElement To = driver.findElement(By.xpath(".//*[@id='treebox2']/div/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td[2]/table/tbody/tr[1]/td[4]/span"));
Actions builder = new Actions(driver);
Action dragAndDrop = builder.clickAndHold(From).moveToElement(To).release(To).build();
dragAndDrop.perform();
Thread.sleep(2000);
}
}
错误消息
线程中的异常" main" org.openqa.selenium.NoSuchElementException:没有这样的元素:无法找到元素:{"方法":" xpath","选择器":"。 // * [@ id中=' treebox1'] / DIV /表/ tbody的/ TR [2] / TD [2] /表/ tbody的/ TR [2] / TD [2] /表/ TBODY / TR [1] / TD [4] /跨度"}
答案 0 :(得分:1)
我不知道是什么导致您使用XPath,但根据源代码看起来并不正确。
替换
WebElement From = driver.findElement(By.xpath(".//*[@id='treebox1']/div/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td[2]/table/tbody/tr[1]/td[4]/span"));
的
WebElement From = driver.findElement(By.xpath(".//*[@id='treebox1']"));
之后应该能够检测到指定的div。
答案 1 :(得分:1)
这里有一些工作代码。我清理了你的一些代码,拿出了不必要的东西等等。
driver.get("http://www.dhtmlx.com/docs/products/dhtmlxTree/index.shtml");
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement from = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("(//span[text()='Thrillers'])[1]")));
WebElement to = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("(//span[text()='Bestsellers'])[2]")));
driver.findElement(By.xpath("//h2[text()='Live Demo']")).click(); // this moves the screen down
Actions builder = new Actions(driver);
builder.dragAndDrop(from, to).build().perform();
你应该在.implicitlyWait()
上做一些阅读。你不想按照自己的方式使用它,绝对没有那么大的超时。我建议你完全摆脱它,只使用明确的等待。
在代码开头等待这两个元素可能有点过分。如果你只是等待第一个,那么第二个很可能已经存在......但为了以防万一。
使用长时间的XPath会遇到麻烦。如果在该长XPath中页面上有任何更改,您的脚本将停止工作。对XPath和CSS选择器进行一些阅读,并学习如何有效地使用它们。它将使您的脚本更具弹性。
在Actions
中,已有dragAndDrop()
方法。只需使用它而不是制作自己的。
我不得不点击Live Demo标题。问题是当执行拖放操作时,屏幕会滚动,并且在页面滚动后显示的菜单会导致它无法正常工作。修复是在拖放之前滚动屏幕,以便源和目标都在屏幕上,而不是由顶部导航菜单等隐藏。还有其他方法滚动屏幕,但这个工作正常。< / p>
您还想避免Thread.sleep()
。阅读WebDriverWait
和ExpectedConditions
,了解如何使用它,如果您需要等待某些事情发生。您可以在上面看到我使用它作为示例。
答案 2 :(得分:0)
我只是隐式地改变了下面的等待是你的代码修改
public static void main(String[] args) throws InterruptedException
{
System.setProperty("webdriver.chrome.driver","G:\\java programme\\SendkeysExample\\lib\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
String URL = "http://www.dhtmlx.com/docs/products/dhtmlxTree/index.shtml";
driver.get(URL);
// It is always advisable to Maximize the window before performing DragNDrop action
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
WebElement From = driver.findElement(By.xpath(".//*[@id='treebox1']/div/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td[2]/table/tbody/tr[1]/td[4]/span"));
WebElement To = driver.findElement(By.xpath(".//*[@id='treebox2']/div/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td[2]/table/tbody/tr[1]/td[4]/span"));
Actions builder = new Actions(driver);
Action dragAndDrop = builder.clickAndHold(From).moveToElement(To).release(To).build();
dragAndDrop.perform();
Thread.sleep(2000);
}