2016-01-12 3 views
1

У меня есть эта Spring - Maven - настройка Tomcat для веб-приложения.Selenium NoSuchElementException

Я тестирую селен, и я не могу найти элемент по имени, altough;

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); 
    } 
+2

Вы можете убедиться, что поле на самом деле называется 'newusername' путем загрузки страницы в браузере и проверка его с помощью консоли разработчика? –

+0

Это не так, но почему? @GergelyBacso [ссылка] (http: // postimg.org/image/yn0o9sge3 /) – Sytham

+2

Selenium получает только ваш окончательный HTML-контент, не видит написанный вами код Spring. Если поле HTML называется 'username' (исходящее из переменной' path', которое я предполагаю), тогда вам нужно указать * this * для Selenium, а не 'newusername'. –

ответ

0

Из-за того, что я не могу изменить тестовый класс (это было задание при разработке, основанном на тестах).

Я изменил поле ввода с входов Spring на стандартные входы HTML. Это решение работает, и новый пользователь сохраняется.

Я признаю тот факт, что это простой и понятный способ просто изменить тест.

Во всяком случае, вот код .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"> 

//changed to basic html inputfields 

    <input name="newusername" type="text" /> 
    <input name="newpassword" type="password" /> 
    <input type="submit" value="ADD USER" name="Add user"> 

</spring:form> 
</body> 
</html> 
+0

Любой, кто может объяснить разницу? В любом случае, мой контроллер все равно подбирает поля. – Sytham

1

Это пр oblem обусловлена ​​тем, что в этом примере переменная path контролирует окончательное название HTML тега, так что на основе этой линии:

<spring:input type="text" name="newusername" path="username"/> 

следующее выражение Селен:

element = driver.findElement(By.name("newusername")); 

должен быть изменено:

element = driver.findElement(By.name("username")); 
2

Это может быть достаточно гибким, чтобы помочь выявить проблему, так как он будет работать на имя username, а также newusername:

WebElement element = driver.findElement(By.xpath(".//input[contains(@name, 'username')]"); 
1

Может быть, селен losting ссылки, потому что путь, я думаю, что если положить Id в своей стихии и изменить код, чтобы найти, Id, эта ошибка не будет происходит более ..

Смежные вопросы