Reputation: 1280
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>
Upvotes: 2
Views: 36085
Reputation: 1
I was facing a similar issue where I was not getting the value even though the XPath was valid (when entered in the inspect mode it was able to find elements). My code looked somewhat like the below -
driver.get("https://www.theurlgoeshere")
elements = driver.find_elements_by_xpath("//*[@class='classname']")
for element in elements:
element.send_keys("Test value")
driver.close()
For the above code, I encountered the error where the element is not found. In order to avoid this error, I have imported the "time" module and added a sleep time after the get statement, with this small modification the code worked.
driver.get("https://www.theurlgoeshere")
time.sleep(3)
elements = driver.find_elements_by_xpath("//*[@class='classname']")
for element in elements:
element.send_keys("Test value")
driver.close()
As it goes on for parallel processing the driver tries to find the class even before it comes up on the dynamic page. The page has to load completely before it searched for the XPath within it.
Upvotes: 0
Reputation: 14736
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();
}
}
Upvotes: 4
Reputation: 15674
Your XPath is searching for an input
tag, which is not present in your XML.
Upvotes: 0