【问题标题】:How to check if an HTML5 validation was triggered using selenium?如何检查是否使用硒触发了 HTML5 验证?
【发布时间】:2012-02-28 23:47:10
【问题描述】:

如果使用 Selenium 测试我的 webapp。 webapp 中的所有表单验证都是使用 HTML5 表单验证完成的。如果使用 Selenium 触发了表单/输入验证,有什么方法可以断言?

【问题讨论】:

    标签: html selenium


    【解决方案1】:

    这样的搜索可以在支持 HTML5 的浏览器中解决问题(使用 Java 和 WebDriver,但也应该可以在其他任何地方使用):

    // looks for an element that has been marked as required on a submit attempt
    WebElement elem1 = driver.findElement(By.cssSelector("input:required"));
    // looks for an element that has been marked as invalid on a submit attempt
    WebElement elem2 = driver.findElement(By.cssSelector("input:invalid"));
    

    可用的 CSS 伪类有:

    【讨论】:

    • 另外,很抱歉回答迟了。我想它总比没有好:)。
    【解决方案2】:

    除了@Slanec 的答案:还添加以下行(使用C#,但在Java 或其他语言中应该相同):

    Assert.IsTrue(true,"<The error message which appears>",elem1);
    

    这是在你想检查消息是否可见的情况下。

    【讨论】:

      【解决方案3】:

      测试负责验证的 HTML5 属性是否存在就足够了。实际上触发验证的浏览器实现并不是真正测试您的工作(而是测试浏览器本身),这可能很好,但在我看来是不必要的。如何做到这一点已经包含在最佳答案中。我的答案只是用纵深防御方法来扩展表单字段验证。

      除了 HTML5 规则之外,您绝对有必要拥有自己的验证,因为当 HTML5 验证不受支持(或被绕过)时。

      第一个问题是 HTML5 验证优先并阻止您测试自己的验证。那么如何处理呢?

      测试 HTML5 验证属性是否存在

      要测试它是否已被使用,请使用assertAttribute

      <tr>
          <td>assertAttribute</td>
          <td>id=myFieldId@required</td>
          <td></td>
      </tr>
      

      如果由于某种原因您使用 XML 语法 required="required",则需要断言该值是“必需的”。

      测试后备验证

      JavaScript

      如果您的 HTML5 验证阻止您的 JavaScript 验证返回错误,则在您断言存在 HMTL5 验证属性后,您可以删除 HTML5 验证属性以测试备用 JavaScript 验证:

      <tr>
          <td>runScript</td>
          <td>document.getElementById('myFieldId').removeAttribute('required')</td>
          <td></td>
      </tr>
      

      现在您可以测试您的 JavaScript 验证。要删除电子邮件验证,您需要将字段的type 属性设置为text

      <tr>
          <td>runScript</td>
          <td>document.getElementById('myFieldId').setAttribute('type','text')</td>
          <td></td>
      </tr>
      

      测试服务器端验证

      即使您使用 HTML5 验证和 JavaScript 验证,如果您提交到服务器,您也需要测试您的服务器是否验证这些字段。

      调用表单的submit() 函数将提交表单而不调用任何验证。 Selenium 的submit 命令做同样的事情:

      <tr>
          <td>submit</td>
          <td>name=myFormName</td>
          <td></td>
      </tr>
      

      等待下一页加载后,您可以检查是否存在预期的错误。

      【讨论】:

      • 虽然我同意您应该测试服务器端验证,但没有什么比有人不回答所提问题更烦人的了。当然,最好测试这个客户端功能,这样您的客户就不会为您找到错误!
      • @AlexWorden assertAttribute 语句足以测试 HTML 验证是否到位。因为 HTML 验证的实现不在作者的控制范围内,您可能不应该测试它的执行,因为移动平台是现代 Web 浏览器的恶劣环境,这非常困难。我想我已经回答了这个问题,然后又回答了一些问题。
      • 顺便说一句,HTML 验证可能还不够成熟,无法解决实际问题。低技能的用户会觉得很迷惑,坦率地说,用户体验还是有点差。你真的不应该使用它,但如果你这样做了,那么我认为确保属性到位并相信它会在支持它的浏览器中完成它的工作就足够了。
      • 我的整个答案还假设所有验证都已到位,因为我正在详细说明如何解决出现的测试问题,因为 HTML5 验证使等效的 Javascript 验证变得多余,从而使等效的服务器端验证变得多余.所以我正在描述如何依次禁用每个机制,以便我们可以彻底测试所有 3 个验证层。 - 否则您的客户会为您找到错误!!!
      【解决方案4】:

      属性validationMessage会返回消息,如果验证失败就会显示:

      WebElement username = driver.findElement(By.id("username"));    
      String validationMessage = username.getAttribute("validationMessage");
      

      如果元素有required属性,提交表单后浏览器会显示消息:

      boolean required = Boolean.parseBoolean(username.getAttribute("required"));
      

      您可以检查输入的值是否有效:

      boolean valid = (Boolean)((JavascriptExecutor)driver).executeScript("return arguments[0].validity.valid;", username);
      


      :消息文本和验证是可自定义的。如果你想测试定制 验证和消息。

      这里是自定义验证的测试代码(Java,TestNG):

      Assert.assertTrue(Boolean.parseBoolean(username.getAttribute("required")), "Username is required and message should be showin");
      Assert.assertEquals(username.getAttribute("validationMessage"), "My custom message", "Message text control");
      
      username.sendKeys("@vasy a^");
      Assert.assertTrue((Boolean)((JavascriptExecutor)driver).executeScript("return arguments[0].validity.valid;", username), "Username should not contain not special characters");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-05
        • 2019-06-17
        • 2016-11-19
        • 2019-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多