java Xpath 是正确的仍然没有这样的元素:无法定位元素
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/39561188/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Xpath is correct still get no such element: Unable to locate element
提问by Tokci
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.
我的 Xpath 是正确的,没有 iFrame,我可以在 Chrome 控制台中找到元素,但我的程序仍然失败。我也使用了显式等待。
website http://newtours.demoaut.com/I am trying to locate login page and send login id.
网站http://newtours.demoaut.com/我正在尝试定位登录页面并发送登录 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']}
通过:openURL 失败:loginToTours **org.openqa.selenium.NoSuchElementException**:**没有这样的元素:无法定位元素:{"method":"xpath","selector":"//input[@name= 'userName']"}** *** 元素信息:{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
测试NG 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
网站HTML源代码
<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>
回答by Krishnan Mahadevan
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 ].
说明:您@Test
的测试类中有两个方法。其中一个打开一个 URL 并等待一个元素出现,另一个方法只搜索该元素。如果 TestNG 最终loginToTours()
首先运行您的测试方法,那么您将看到此错误消息。默认情况下,TestNG 按字母顺序执行方法。由于loginToTours()
没有指定findElement()
要位于哪个网页中,Selenium 最终会在空白页面上执行它,因此您会看到错误消息。修复loginToTours()
方法之一是让方法依赖,openURL()
这样在搜索发生之前,浏览器中已经打开了一个有效的网页。[这正是我在清理代码中所做的]。
WebDriver is at no fault here :)
WebDriver 在这里没有错:)
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();
}
}
回答by Joe C
Your XPath is searching for an input
tag, which is not present in your XML.
您的 XPath 正在搜索input
XML 中不存在的标记。