WebDriver可以';无法使用Java通过xpath查找元素

WebDriver可以';无法使用Java通过xpath查找元素,java,testing,xpath,selenium,webdriver,Java,Testing,Xpath,Selenium,Webdriver,以下是使用Java的WebDriver代码片段: WebDriver driver = new FirefoxDriver(); driver.get("http://www.google.pl/"); driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); WebElement element = driver.findElement(By.name("q"

以下是使用Java的WebDriver代码片段:

        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中出现异常:无法找到元素:{“方法”:“xpath”,“选择器”:“//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(本机方法) 位于sun.reflect.NativeConstructorAccessorImpl.newInstance(未知源) 位于sun.reflect.delegatingConstructor或AccessorImpl.newInstance(未知源) 位于java.lang.reflect.Constructor.newInstance(未知源) 位于org.openqa.selenium.remote.ErrorHandler.CreateTrowable(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.findelementbypath(RemoteWebDriver.java:265) 位于org.openqa.selenium.By$6.findElement(By.java:205) 位于org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:184) at test.main(test.java:24)


我的代码出了什么问题?

在本例中,您需要的XPath表达式是:

//html/body/center/form/table/tbody/tr/td[2]/div/input
或者你可以用这个(稍微直观一点):

请记住,如果您将通过XPath识别许多元素,建议您熟练使用XPath,您可以从这里开始:

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


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

因为您需要波兰Google站点

    //input[@title='Google Search']
不会为你工作的。改用

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

如果希望通过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);

还可以找到有关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")));
@用户729076: 您为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">
通过xpath:

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

此处使用的XPath是不正确的,因此不需要使用XPath

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

XAPTH表达式不会计算为现有元素,仅此而已。您必须更改表达式。xpath应该在该站点上显示什么?我正在测试一个web应用程序,我只能通过xpath识别元素。所以我试着在谷歌上做一个例子。在这两种情况下,它都不起作用。该xpath是指向输入的,在输入中键入单词,然后单击搜索。您能告诉我应该更改上面的哪个表达式吗?取决于您的HTML,您提供了无效的xpath,这里的Selenium没有问题。您的xpath太长(绝对xpath),这是一个糟糕的做法。您应该尝试使用短xpath(相对xpath)。CssSelector比xpath更快。最好使用id或name而不是xpath。您的HTML代码中有任何id或名称吗?如果是,请使用ID或name如果OP在更新的WebDriver中编写测试,那么就没有理由使用旧的Selenium RC。我使用了稍微不同的语法。WebElement email=webdriver.findElement(By.xpath(//input[@id='signin\u username'][2]”);它找不到[2]思想如果在使用显式等待后失败,请重新检查xpath的正确性。或者,您可以使用id或名称而不是XPath。要查找的元素可能没有任何id,并且仅为Selenium测试添加它可能不合适。无论如何,感谢您对StackOverflow的贡献:)。不过,你回答的问题已经很老了,而且已经得到了回答——如果你也能努力解决更紧迫的问题,我们会很高兴的。
driver.findElement(By.xpath("//input[@id='gbqfq']")).sendKeys("some text");
driver.findElement(By.id("gbqfq")).sendKeys("xyz");