繁体   English   中英

如何在 Selenium 中使用 javascript 读取 HTML5 约束验证错误消息

[英]How to read HTML5 Constraint validation error message using javascript in Selenium

我有一个包含必填字段的表单,当我尝试提交带有空白必填字段的表单时,会显示一条错误消息,如下面的屏幕截图所示。 使用 Java 中的 Selenium 无法识别是否显示错误消息,因为这些错误是 HTML5 并且它们不存在于 Dom 中。 所以我google了一下,发现我们可以使用Javascript。 但是当我使用它时,即使显示了消息,我每次都会变得错误。 您的帮助将不胜感激。

WebElement field = driver.findElement(By.xpath('//input[@id='frstNm']'))

WebElement registerBtn = driver.findElement(By.xpath('//div//button[text()='Register']'))

registerBtn.click() Boolean is_valid = ((js.executeScript('return arguments[0].checkValidity();', field)) as Boolean)

String message = ((js.executeScript('return arguments[0].validationMessage;', field)) as String)

println(is_valid)

html:

 <div class="row" style="border: solid 1px white"> <input id="prtyId" name="prtyId" type="hidden" value=""> <div class="col-xs-3 col-md-3" style="border: solid 1px white"> <div class="row"> <div class="col-xs-10 col-md-10 required"> <label for="frstNm" class="control-label">First Name</label> <input id="frstNm" name="frstNm" onkeypress="return event.charCode < 48 || event.charCode > 57" type="text" class="form-control" required="required" value="" maxlength="50"> </div> </div> <br> <div class="row"> <div class="col-xs-7 col-md-7 required"> <label for="mi">Middle Initial</label> <input id="mi" name="mi" onkeypress="return event.charCode < 48 || event.charCode > 57" type="text" class="form-conrol" value="" maxlength="1"> </div></div> <br> <div class="row"> <div class="col-xs-10 col-md-10 required"> <label for="lstNm" class="control-label">Last Name</label> <input id="lstNm" name="lstNm" onkeypress="return event.charCode < 48 || event.charCode > 57" type="text" class="form-control" required="required" value="" maxlength="50"> </div> </div> <br> <div class="row"> <div class="col-xs-10 col-md-10 required"> <label for="suffix">Suffix</label><input id="suffix" name="suffix" onkeypress="return event.charCode < 48 || event.charCode > 57" type="text" class="form-control" value="" maxlength="5"> </div> </div> <br> <div class="row"> <div class="col-xs-10 col-md-10 required"> <label for="socialSecurity" class="control-label">SSN</label> <input id="socialSecurity" name="socialSecurity" onkeypress="return event.charCode >= 48 &amp;&amp; event.charCode <= 57" pattern="\d{3}-\d{2}-\d{4}" placeholder="XXX-XX-XXXX" type="text" class="form-control" required="required" value="" maxlength="11"> </div> </div> <br> <div class="row"> <div class="col-xs-10 col-md-10 required"> <label for="dateOfBirth" class="control-label">Date of Birth</label> <input id="dateOfBirth" name="dateOfBirth" onkeypress="return event.charCode >= 48 &amp;&amp; event.charCode <= 57" pattern="\d{2}/\d{2}/\d{4}" placeholder="MM/DD/YYYY" type="text" class="form-control" required="required" value="" maxlength="10"> </div> </div> <br> <div class="row"> <div class="col-xs-7 col-md-7 required"> <label for="gender" class="control-label">Gender</label> <select id="gender" name="gender" class="form-control" required="required"> <option value="">----Select----</option> <option class="form-control" value="M">Male</option><option class="form-control" value="F">Female</option><option class="form-control" value="O">Other</option> </select> </div> </div> <br> <div class="row"> <div class="col-xs-10 col-md-10"> <label for="emailAddress">Email Address</label> <input id="emailAddress" name="emailAddress" placeholder="mailbox@domain.tld" type="email" class="form-control" value="" maxlength="50"> </div> </div> <br> </div>

表格截图在此处输入图像描述

您所指的错误消息,即请填写此字段约束 API 的element.setCustomValidity()方法的结果。

注意:HTML5 约束验证不会消除服务器端验证的需要。 尽管预期的无效表单请求要少得多,但不兼容的浏览器(例如,没有 HTML5 且没有 JavaScript 的浏览器)或试图欺骗您的 web 应用程序的坏人仍然可以发送无效表单请求。 因此,与 HTML4 一样,您还需要验证服务器端的输入约束,其方式与客户端所做的一致。

解决方案

要检索文本请填写此字段,您必须为elementToBeClickable()诱导WebDriverWait ,您可以使用以下任一 定位器策略

  • 使用CSS_SELECTOR

     System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("input#lstNm"))).getAttribute("validationMessage"));
  • 使用XPATH

     System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//input[@id='lstNm']"))).getAttribute("validationMessage"));

参考

您可以在以下位置找到一些相关的讨论:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM