【发布时间】:2012-02-28 23:47:10
【问题描述】:
如果使用 Selenium 测试我的 webapp。 webapp 中的所有表单验证都是使用 HTML5 表单验证完成的。如果使用 Selenium 触发了表单/输入验证,有什么方法可以断言?
【问题讨论】:
如果使用 Selenium 测试我的 webapp。 webapp 中的所有表单验证都是使用 HTML5 表单验证完成的。如果使用 Selenium 触发了表单/输入验证,有什么方法可以断言?
【问题讨论】:
这样的搜索可以在支持 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 伪类有:
【讨论】:
除了@Slanec 的答案:还添加以下行(使用C#,但在Java 或其他语言中应该相同):
Assert.IsTrue(true,"<The error message which appears>",elem1);
这是在你想检查消息是否可见的情况下。
【讨论】:
测试负责验证的 HTML5 属性是否存在就足够了。实际上触发验证的浏览器实现并不是真正测试您的工作(而是测试浏览器本身),这可能很好,但在我看来是不必要的。如何做到这一点已经包含在最佳答案中。我的答案只是用纵深防御方法来扩展表单字段验证。
除了 HTML5 规则之外,您绝对有必要拥有自己的验证,因为当 HTML5 验证不受支持(或被绕过)时。
第一个问题是 HTML5 验证优先并阻止您测试自己的验证。那么如何处理呢?
要测试它是否已被使用,请使用assertAttribute:
<tr>
<td>assertAttribute</td>
<td>id=myFieldId@required</td>
<td></td>
</tr>
如果由于某种原因您使用 XML 语法 required="required",则需要断言该值是“必需的”。
如果您的 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>
等待下一页加载后,您可以检查是否存在预期的错误。
【讨论】:
assertAttribute 语句足以测试 HTML 验证是否到位。因为 HTML 验证的实现不在作者的控制范围内,您可能不应该测试它的执行,因为移动平台是现代 Web 浏览器的恶劣环境,这非常困难。我想我已经回答了这个问题,然后又回答了一些问题。
属性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");
【讨论】: