Xpath is correct still get no such element: Unable to locate element

20,966

The problem lies in your test code.

Explanation : You have two @Test methods in your test class. One of them opens up a URL and waits for an element to be present and the other method which just searches for the element. If TestNG ends up running your loginToTours() test method first, that is when you will see this error message. By default TestNG executes methods in an alphabetical order. Since loginToTours() doesn't specify in which web page the findElement() is to be located, Selenium ends up executing it on a blank page and thus you see the error message. One of the fixes would be to have loginToTours() method depend on openURL() so that way there is already a valid web page opened up in the browser before the search happens. [ That is exactly what I have done in my cleaned up code as well ].

WebDriver is at no fault here :)

Here's a cleaned up version of your test code which will work fine

public class CallUrl {
    WebDriver driver;

    @BeforeClass
    public void openBrowser() throws IOException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("chrome.switches", "--disable-extensions");
        driver = new ChromeDriver(options);
    }

    @AfterClass
    public void cleanup() {
        if (driver != null) {
            driver.quit();
        }
    }

    @Test
    public void openURL() throws IOException {
        driver.get("http://newtours.demoaut.com/");
        WebDriverWait myDynamicElement = new WebDriverWait(driver, 30);
        myDynamicElement.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//input[@name='userName']")));
    }

    @Test (dependsOnMethods = "openURL")
    public void loginToTours() throws InterruptedException {
        driver.findElement(By.xpath("//input[@name='userName']")).click();
    }

}
Share:
20,966
Tokci
Author by

Tokci

I work on Python/R, Machine learning , Google Cloud Platform.

Updated on October 16, 2021

Comments

  • Tokci
    Tokci over 2 years

    My Xpath is correct & no iFrame and I can locate element in Chrome console but my program still fails. I have used explicit wait also.

    website http://newtours.demoaut.com/ I am trying to locate login page and send login id.

    Error message:

    PASSED: openURL FAILED: loginToTours **org.openqa.selenium.NoSuchElementException**: **no such element: Unable to locate element: {"method":"xpath","selector":"//input[@name='userName']"}** *** Element info: {Using=xpath, value=//input[@name='userName']}
     package SeleniumPracticePackage;
     import org.openqa.selenium.By;
     import org.openqa.selenium.WebDriver;
     import org.openqa.selenium.WebElement;
     import org.openqa.selenium.chrome.ChromeDriver;
      import org.openqa.selenium.chrome.ChromeOptions;
     import org.openqa.selenium.support.ui.ExpectedConditions;
     import org.openqa.selenium.support.ui.WebDriverWait ;
     import java.io.FileInputStream;
     import java.io.IOException;
     import java.util.List;
     import java.util.Properties;
     import org.testng.annotations.BeforeTest;
     import org.testng.annotations.Parameters;
     import org.testng.annotations.Test;
    
     public class CallUrl {
    
    WebDriver driver;
    Properties prop;    
    
    @BeforeTest
    public void openBrowser() throws IOException
    {
    
    // driver = new ChromeDriver();
    
     ChromeOptions options = new ChromeOptions();
     options.addArguments("chrome.switches","--disable-extensions");
     System.setProperty("webdriver.chrome.driver","C:\\Users\\Ashish\\Documents\\Selenium\\drivers\\chromedriver_win32\\chromedriver.exe");
     //System.setProperty("webdriver.chrome.driver",(System.getProperty("user.dir") + "//src//test//resources//chromedriver_new.exe"));
     driver = new ChromeDriver(options);     
    }
    @Test
    public void openURL() throws IOException
    {
    //call URL from properties file
     prop = new Properties();
    FileInputStream urlFile = new FileInputStream("C:\\Users\\Ashish\\Documents\\Selenium\\SeleniumPracticeSite\\src\\URL.properties");
    prop.load(urlFile); 
    driver.get(prop.getProperty("URL"));
    WebDriverWait myDynamicElement = new WebDriverWait(driver,30);
    myDynamicElement.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//input[@name='userName']")));
    }
    
    @Test       
    public void loginToTours () throws InterruptedException
    {
    
      driver.findElement(By.xpath("//input[@name='userName']")).click();
      //sendKeys(prop.getProperty("login"));
    
    }   
    
    }
    

    TestNG XML

    <?xml version="1.0" encoding="UTF-8"?>
      <suite name = "Automation Practice Test">
        <test name ="smoke test">  
          <groups>
            <run>
              <include name="Priority2" />
            </run>
          </groups>
             <classes>
                <class name ="SeleniumPracticePackage.CallUrl" />
             </classes>
           </test>
       </suite> 
    

    Website HTML source code

                     <tr>
                      <td align="right"><font face="Arial, Helvetica, sans-serif" size="2">User 
                        Name: </font></td>
                      <td width="112">
                        <input type="text" name="userName" size="10">
                      </td>
                    </tr>
    
  • Tokci
    Tokci over 7 years
    refer to input tag
  • Joe C
    Joe C over 7 years
    Right, you need to specify the exact XML that you're parsing here. The XML you said you are parsing does not have an input tag, and the input tag you just randomly put in the comment is not part of the XML in your question.
  • Tokci
    Tokci over 7 years
    You are looking for xml used by TestNG or HTML/CSS code of website ? The one I pasted is HTML used the website and xml pasted in question is TestNG xml .. I have also given the link to the website
  • Tokci
    Tokci over 7 years
    Thanks , for the perfect answer :-)