user729076
user729076

Reputation: 261

WebDriver can't find element by xpath using Java

The following is the snippet of WebDriver code using Java:

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

After execution of code I got the following exception:

Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"xpath","selector":"//html/body/div[2]/span/center/form/table/tbody/tr/td[2]/div/div/input"} System info: os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.6.0_24' Driver info: 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) at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:131) at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:105) at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:409) at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:192) at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:265) at org.openqa.selenium.By$6.findElement(By.java:205) at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:184) at test.main(test.java:24)

What's the wrong in my code?

Upvotes: 2

Views: 62373

Answers (6)

Ripon Al Wasim
Ripon Al Wasim

Reputation: 37826

Your xpath expression:

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

looks correct but if you still are facing the issue please check the correctness of xpath again. If it fails again increase the time for Wait as:

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

or you can use explicit wait for the specific element as below:

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

Upvotes: 5

user3487861
user3487861

Reputation: 350

The XPath Used is Incorrect Here Directly Id is there so no need to use XPath.

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

Upvotes: 0

hoshang.varshney
hoshang.varshney

Reputation: 1120

If you want to find elements by XPath. Then do the following:

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

Also find more help on this site

Upvotes: 0

Ripon Al Wasim
Ripon Al Wasim

Reputation: 37826

@user729076: The xpath "//html/body/div[2]/span/center/form/table/tbody/tr/td[2]/div/div/input" you wrote for google text field is not right. The HTML for google text field is as follows:

<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">

Based on the above HTML, you can use simply id or xpath as below: By id:

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

By xpath:

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

Upvotes: 2

Mikael Magnusson
Mikael Magnusson

Reputation: 63

Since you want the Polish Google site the

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

will not work for you. Instead use

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

Upvotes: 3

Anders
Anders

Reputation: 15397

In this case the XPath expression you want is:

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

Or you could use this (a little more intuitive):

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

Keep in mind that if you will be identifying a lot of elements by XPath it would be advisable to become fluent in XPath, you could start here: Xpath Tutorial

In the meantime, use Firefox and install the following plugins:

Firebug

FirePath or Firefinder

These will help you easily identify valid XPath expressions to use for your website.

Upvotes: 2

Related Questions