执行时无法找到xpath

时间:2016-07-09 06:08:03

标签: selenium xpath

以下代码用于使用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] /跨度"}

3 个答案:

答案 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()。阅读WebDriverWaitExpectedConditions,了解如何使用它,如果您需要等待某些事情发生。您可以在上面看到我使用它作为示例。

答案 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);
    }