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

时间:2011-04-28 10:29:12

标签: 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")); 
        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 /形式/表/ tbody的/ TR / TD [2] / DIV / DIV /输入“}   系统信息:os.name:'Windows 7',os.arch:'x86',os.version:'6.1',java.version:'1.6.0_24'   驱动程序信息:driver.version:RemoteWebDriver       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)       at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)       at java.lang.reflect.Constructor.newInstance(Unknown Source)       在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)

我的代码有什么问题?

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

因为你想要波兰的谷歌网站

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

不适合你。而是使用

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

答案 2 :(得分:2)

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

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

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

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

请记住,如果您要通过XPath识别很多元素,建议您熟悉XPath,可以从这里开始:Xpath Tutorial

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

Firebug

FirePathFirefinder

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

答案 3 :(得分:2)

@ user729076: 你为谷歌文本字段写的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,如下所示: 按id:

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

通过xpath:

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

答案 4 :(得分:0)

如果您想通过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

的更多帮助

答案 5 :(得分:0)

使用的XPath不正确这里直接ID是没有必要使用XPath。

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