【问题标题】:How to read HTML5 Constraint validation error message using javascript in Selenium如何在 Selenium 中使用 javascript 读取 HTML5 约束验证错误消息
【发布时间】:2020-11-01 09:32:23
【问题描述】:

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

WebElement 字段 = 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)

字符串消息 = ((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>

表单截图

【问题讨论】:

标签: javascript selenium xpath css-selectors constraint-validation


【解决方案1】:

您所引用的错误消息,即请填写此字段Constraint API's element.setCustomValidity()方法的结果。

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

解决方案

要检索文本请填写此字段,您必须将WebDriverWait 诱导为elementToBeClickable(),您可以使用以下任一 Locator Strategies

  • 使用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"));
    

参考文献

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

【讨论】:

  • 感谢您的评论。它工作正常。我犯的错误是没有将数据输入到我试图检查消息的字段中,因此每次都返回 false。我认为只有在显示错误的弹出消息时才进行检查。
  • @Vin 这不是评论本身,而是经过充分研究的规范答案。请accept answer 点击我的 answer 旁边的空心刻度线,它就在 votedown 箭头下方,这样刻度线就会转动绿色.
猜你喜欢
  • 2019-08-13
  • 2016-09-22
  • 2018-12-10
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 2020-11-18
  • 1970-01-01
相关资源
最近更新 更多