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

不羁的心 提交于 2019-12-11 05:38:23

问题


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>

回答1:


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

}



回答2:


Your XPath is searching for an input tag, which is not present in your XML.



来源:https://stackoverflow.com/questions/39561188/xpath-is-correct-still-get-no-such-element-unable-to-locate-element

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!