WebDriver无法使用Java通过xpath找到元素

以下是使用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"); 

执行代码后,我得到以下exception:

线程“main”中的exceptionorg.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:sun.reflect.NativeConstructorAccessorImpl.newInstance0(本地方法)中的sun.reflect.NativeConstructorAccessorImpl.newInstance(未知来源)位于sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知来源)处的RemoteWebDriver org.openqa.selenium.remote上的org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:131)中的java.lang.reflect.Constructor.newInstance(未知来源).ErrorHandler.throwIfResponseFailed(ErrorHandler.java:105 )org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:409)org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:192)at org.openqa.selenium.remote.RemoteWebDri ver.findElementByXPath(RemoteWebDriver.java:265)atg.openqa.selenium.By $ 6.findElement(By.java:205)at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:184)at test。主(test.java:24)

我的代码有什么问题?

@ user729076:你为谷歌文本字段写的xpath“// html / body / div [2] / span / center / form / table / tbody / tr / td [2] / div / div / input”是不对的。 Google文本字段的HTML如下:

  

基于上面的HTML,你可以使用id或xpath,如下所示:按id:

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

通过xpath:

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

你的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"))); 

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

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

不适合你。 而是使用

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

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

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

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

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

请记住,如果您将通过XPath识别许多元素,那么建议您熟悉 XPath,您可以从这里开始: Xpath教程

在此期间,使用Firefox并安装以下插件:

萤火

FirePath或Firefinder

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

如果要通过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不正确这里直接ID是没有必要使用XPath。

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