【发布时间】:2016-04-17 15:26:18
【问题描述】:
我有这个 Spring - Maven - Tomcat 的 web 应用程序设置。
我正在使用 selenium 进行测试,但我无法通过名称找到元素;
1) 我正在等待页面加载,
2) 我的 .jsp 视图页面中明确设置了名称。
另外,测试的主要目标是输入用户名和密码,在控制器中页面被重定向到下面的 .jsp 文件。然后页面有时间加载。
我注意到只有这个错误才会跳过等待时间。
截图: http://postimg.org/image/aka5az82l/
错误:
org.openqa.selenium.NoSuchElementException: Unable to locate element with name: newusername
JSP 页面:
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Favorites: root</title>
</head>
<body>
<p>Add a User</p>
<spring:form action="/tdd/addUser" method="post" modelAttribute="user">
//Element name here
<spring:input type="text" name="newusername" path="username"/>
<spring:input type="password" name="newpassword" path="password"/>
<input type="submit" value="ADD USER" name="Add user">
</spring:form>
</body>
</html>
测试类:
@Test
public void testHomeScreenRoot() {
WebDriver driver = new HtmlUnitDriver();
driver.get("http://127.0.0.1:9999/tdd");
WebElement element = driver.findElement(By.name("username"));
element.sendKeys("root");
element = driver.findElement(By.name("password"));
element.sendKeys("rootpasswd");
element.submit();
//Waiting here
(new WebDriverWait(driver, 10)).until((WebDriver d) -> d.getTitle().equals("Favorites: root"));
//Error here
element = driver.findElement(By.name("newusername"));
String tagName = element.getTagName();
assertEquals("input", tagName);
element = driver.findElement(By.name("newpassword"));
tagName = element.getTagName();
assertEquals("input", tagName);
element = driver.findElement(By.name("Add user"));
tagName = element.getTagName();
assertEquals("input", tagName);
String type = element.getAttribute("type");
assertEquals("submit", type);
}
【问题讨论】:
-
您能否通过在浏览器中加载页面并使用开发控制台检查该字段来验证该字段是否实际称为
newusername? -
不是,但为什么呢? @GergelyBacso link
-
Selenium 只能满足你最终的 HTML 内容,看不到你写的 Spring 代码。如果 HTML 字段名为
username(我猜来自path变量),那么您需要将 that 提供给 Selenium,而不是newusername。 -
你是对的,但练习是在不改变任何内容的情况下通过测试,我可以将
path更改为newusername但随后我也收到错误Invalid property "newusername" of bean class所以我需要更改User类。但是测试的目的是这样的,对吗? -
这三个变量要同步:你的
path变量+你用于Selenium的字符串+应用程序中的bean字段。决定允许覆盖其中的哪一个?一个合乎逻辑的事情是将测试调整到产品代码,但如果你把它作为一个作业,你可能会在不同的规则下操作。
标签: java spring maven jsp selenium