如果使用Selenium测试我的webapp。 webapp中的所有表单验证都是使用HTML5表单验证完成的。有没有办法断言是否使用Selenium触发了表单/输入验证?
答案 0 :(得分:16)
像这样的搜索在支持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伪类是:
答案 1 :(得分:3)
您无需测试它,测试HTML5属性是否足够。否则,无论出于何种原因,浏览器都会更改验证的行为方式,您可能需要重新进行测试。
但是,您应该测试HTML5验证不可用时的所有后备验证。确定的用户绕过HTML5验证和JavaScript验证并不困难。
要测试它已被使用,请使用assertAttribute
:
<tr>
<td>assertAttribute</td>
<td>id=myFieldId@required</td>
<td></td>
</tr>
如果您使用的是XML语法required="required"
,则需要断言值为“required”:
<tr>
<td>assertAttribute</td>
<td>id=myFieldId@required</td>
<td>required</td>
</tr>
如果您的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>
等待下一页加载后,您可以检查是否存在预期的错误。
答案 2 :(得分:2)
属性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");
答案 3 :(得分:0)
除了来自@Slanec的答案之外:还添加以下行(使用C#,但在Java或其他语言中应该相同):
Assert.IsTrue(true,"<The error message which appears>",elem1);
这是为了检查邮件是否可见。