【问题标题】:Selenium NoSuchElementException硒 NoSuchElementException
【发布时间】: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


【解决方案1】:

这个问题是由以下事实引起的,在这个例子中path变量控制了HTML标签的最终名称,所以基于这一行:

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

以下 Selenium 表达式:

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')]");
    

    【讨论】:

      【解决方案3】:

      也许selenium因为路径而丢失了引用,我认为如果你在你的元素中放置一个Id并更改代码以通过Id查找,这个错误就不会再发生了..

      【讨论】:

        【解决方案4】:

        由于我无法更改测试类(这是测试驱动开发的作业)。

        我已将输入字段从 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>
        

        【讨论】:

        • 谁能解释其中的区别?无论如何,我的控制器都会选择这些字段..
        猜你喜欢
        • 1970-01-01
        • 2015-11-06
        • 2021-04-20
        • 2015-01-09
        • 1970-01-01
        • 2020-12-07
        • 2021-10-21
        • 2021-11-23
        • 1970-01-01
        相关资源
        最近更新 更多