【问题标题】:unable to find xpath when executed执行时找不到xpath
【发布时间】:2016-11-11 17:55:46
【问题描述】:

下面的代码用于使用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 中的异常:没有这样的元素:无法找到元素:{"method":"xpath","selector":".//*[@id='treebox1 ']/div/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td[2]/table/tbody/tr[1]/td[4]/span"}

【问题讨论】:

    标签: selenium xpath


    【解决方案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。

    【讨论】:

    • 拜托,拜托,拜托...不要使用 XPath 来查找 ID 之类的简单内容。 By.id("treebox1") 可以正常工作并且速度更快。
    【解决方案2】:

    这里有一些工作代码。我清理了你的一些代码,去掉了不必要的部分,等等。

    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 中页面上发生任何变化,您的脚本将停止工作。阅读 XPaths 和 CSS 选择器并学习如何有效地使用它们。这将使您的脚本更有弹性。

    Actions 中,已经有一个dragAndDrop() 方法。只需使用它,而不是自己制作。

    我必须点击 Live Demo 标题。问题是,当执行拖放操作时,屏幕会滚动,并且拖放会碰到页面滚动后出现的菜单,导致它无法工作。修复方法是在拖放之前滚动屏幕,以便源和目标都在屏幕上,并且不会被顶部导航菜单等隐藏。还有其他滚动屏幕的方法,但这个工作得很好。

    您还想避免Thread.sleep()。阅读WebDriverWaitExpectedConditions 并了解如何在需要等待某些事情发生时使用它。您可以看到我在上面使用它作为示例。

    【讨论】:

      【解决方案3】:

      我只隐式更改了下面的参数是你的修改代码

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

      【讨论】:

      • 如上一个答案中所述,当您只能使用'By.id()'时,不建议使用xpath
      • 根据我的观点,它适用于这个 xpath 唯一的隐式等待问题
      猜你喜欢
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      相关资源
      最近更新 更多