Xpath is correct still get no such element: Unable to locate element
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();
}
}
Tokci
I work on Python/R, Machine learning , Google Cloud Platform.
Updated on October 16, 2021Comments
-
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 over 7 yearsrefer to input tag
-
Joe C over 7 yearsRight, 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 over 7 yearsYou 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 over 7 yearsThanks , for the perfect answer :-)