【问题标题】:WebDriver can't find element by xpath using JavaWebDriver无法使用Java通过xpath找到元素
【发布时间】:2025-12-29 07:40:06
【问题描述】:

以下是使用Java的WebDriver代码的sn-p:

        WebDriver driver = new FirefoxDriver();
        driver.get("http://www.google.pl/");
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 
        WebElement element = driver.findElement(By.name("q")); 
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
WebElement query = driver.findElement(By.xpath("//html/body/div[2]/span/center/form/table/tbody/tr/td[2]/div/div/input"));

query.sendKeys("asd");

执行代码后出现以下异常:

线程“main”中的异常 org.openqa.selenium.NoSuchElementException: 无法定位元素:{"method":"xpath","selector":"//html/body/div[2]/span/center /form/table/tbody/tr/td[2]/div/div/input"} 系统信息:os.name:'Windows 7',os.arch:'x86',os.version:'6.1',java.version:'1.6.0_24' 驱动程序信息:driver.version:RemoteWebDriver 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(未知来源) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知来源) 在 java.lang.reflect.Constructor.newInstance(未知来源) 在 org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:131) 在 org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:105) 在 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:409) 在 org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:192) 在 org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:265) 在 org.openqa.selenium.By$6.findElement(By.java:205) 在 org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:184) 在 test.main(test.java:24)

我的代码有什么问题?

【问题讨论】:

  • XAPTH 表达式不会计算为现有元素,仅此而已。你必须改变表达方式。
  • xpath 应该在该站点上显示什么?
  • 我正在测试一个 Web 应用程序,我只能通过 xpath 识别元素。所以我尝试在谷歌上做例子。在这两种情况下它都不起作用。该 xpath 是您输入单词然后单击搜索的输入。你能告诉我应该改变一个以上的表达吗?
  • 取决于你的 HTML,你提供了一个无效的 xpath,这里 Selenium 没有问题。它完全按照应有的方式工作。
  • 您的 xpath 太长(绝对 xpath),这是不好的做法。您应该尝试使用短 xpath(相对 xpath)。 CssSelector 比 xpath 更快。最好使用 id 或 name 而不是 xpath。您的 HTML 代码中是否有任何 ID 或名称?如果是,请使用 ID 或姓名

标签: java testing xpath selenium webdriver


【解决方案1】:

你的 xpath 表达式:

WebElement query = driver.findElement(By.xpath("//html/body/div[2]/span/center/form/table/tbody/tr/td[2]/div/div/input"));

看起来正确,但如果您仍然遇到问题,请再次检查 xpath 的正确性。如果再次失败,请增加等待时间:

driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

或者您可以使用显式等待特定元素,如下所示:

WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//html/body/div[2]/span/center/form/table/tbody/tr/td[2]/div/div/input")));

【讨论】:

  • 我使用了稍微不同的语法。 WebElement email = webdriver.findElement(By.xpath("//input[@id='signin_username'][2]"));虽然没有找到 [2]
  • 如果使用显式等待后失败,请重新检查xpath的正确性。或者,您可以使用 id 或 name 代替 xpath
【解决方案2】:

既然你想要波兰的谷歌网站

    //input[@title='Google Search']

不适合你。而是使用

    //input[@title='Szukaj w Google']

【讨论】:

    【解决方案3】:

    @user729076: 您为 google 文本字段编写的 xpath "//html/body/div[2]/span/center/form/table/tbody/tr/td[2]/div/div/input" 不正确。 google 文本字段的 HTML 如下:

    <input type="text" value="" autocomplete="off" name="q" class="gbqfif" id="gbqfq" style="border: medium none; padding: 0pt; margin: 0pt; height: auto; width: 100%; background: url(&quot;data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw%3D%3D&quot;) repeat scroll 0% 0% transparent; position: absolute; z-index: 6; left: 0px; outline: medium none;" dir="ltr" spellcheck="false">
    

    基于上面的 HTML,您可以简单地使用 id 或 xpath,如下所示: 按编号:

    driver.findElement(By.id("gbqfq")).sendKeys("some text");
    

    通过 xpath:

    driver.findElement(By.xpath("//input[@id='gbqfq']")).sendKeys("some text");
    

    【讨论】:

      【解决方案4】:

      在这种情况下,您想要的 XPath 表达式是:

      //html/body/center/form/table/tbody/tr/td[2]/div/input
      

      或者你可以使用这个(更直观一点):

      //input[@title='Google Search']
      

      请记住,如果您要通过 XPath 识别大量元素,建议您精通 XPath,您可以从这里开始:Xpath Tutorial

      同时,请使用 Firefox 并安装以下插件:

      Firebug

      FirePathFirefinder

      这些将帮助您轻松识别有效的 XPath 表达式以用于您的网站。

      【讨论】:

        【解决方案5】:

        如果您想通过 XPath 查找元素。然后执行以下操作:

        WebDriver driver = new FirefoxDriver();
        String baseUrl = "http://www.google.com";
        Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);
        selenium.open("http://www.google.com");
        selenium.isElementPresent(XPath Variable);
        

        还可以在 site 上找到更多帮助

        【讨论】:

        • 如果 OP 在较新的 WebDriver 中编写测试,真的没有理由回退到旧的 Selenium RC。
        【解决方案6】:

        使用的 XPath 不正确,这里直接有 Id,所以不需要使用 XPath。

        driver.findElement(By.id("gbqfq")).sendKeys("xyz");
        

        【讨论】:

        • 要查找的元素可能没有任何 Id,可能不适合仅在 Selenium 测试中添加它。
        • 无论如何,感谢您对 * 的贡献 :)。不过,您要回答的问题已经过时并且已经回答了 - 如果您也能努力解决更紧迫的问题,我们将很高兴。