Selenium 检查“是否”;请输入电子邮件地址“;消息出现

Selenium 检查“是否”;请输入电子邮件地址“;消息出现,selenium,webdriver,watir,watir-webdriver,browser-automation,Selenium,Webdriver,Watir,Watir Webdriver,Browser Automation,给出一个简单的页面: <form> <input type="email"> <button>click</button> </form> 点击 如果我在文本字段中输入任何非电子邮件的内容并单击按钮,请输入电子邮件地址消息将出现 是否有办法使用Selenium或Watir检查消息是否显示?据我所见,浏览器DOM中没有出现任何新内容 由于页面使用的是浏览器内置的电子邮件检查功能,因此检查出现的错误消息是否有意义?它与检查浏览

给出一个简单的页面:

<form>
  <input type="email">
  <button>click</button>
</form>

点击
如果我在文本字段中输入任何非电子邮件的内容并单击按钮,
请输入电子邮件地址
消息将出现

是否有办法使用Selenium或Watir检查消息是否显示?据我所见,浏览器DOM中没有出现任何新内容

由于页面使用的是浏览器内置的电子邮件检查功能,因此检查出现的错误消息是否有意义?它与检查浏览器滚动条是否工作处于同一级别。我们不再检查web应用程序,而是检查平台(浏览器)


前面的一个相关问题是:

您可以这样尝试

JavascriptExecutor js = (JavascriptExecutor) driver;
driver.findElement(By.cssSelector("input[type='email']")).sendKeys("asd");
Object s=js.executeScript("return document.getElementById(\"a\").validity.valid");
System.out.println(s);
driver.findElement(By.cssSelector("input[type='email']")).sendKeys("asd@gmail.com");
s=js.executeScript("return document.getElementById(\"a\").validity.valid");
System.out.println(s);
上述行的输出为

false
true
基于此,您可以得出结论,给定的值是否有效

下面的javascript逻辑将根据字段的有效性返回true/false

document.getElementById(\"a\").validity.valid

注:我假设输入标签的id为“a”

我同意这已经开始接近“测试浏览器”,如果你的代码依赖于浏览器的功能,那么网站需要生成正确的html(5)代码,以便浏览器知道你需要那个级别的验证,这是你可以验证的

在这方面有一些好的背景

浏览器端验证是由特定输入类型(您可以通过watir的
.type
方法检查)和新的
required
属性(这可能很难检查)的组合触发的。鉴于此,我认为我实际上看到了watir中新功能的一个很好的原因。我想我们可以使用
.required?
方法,所有支持新“required”属性的输入元素都应该支持该方法,如果该“required”属性存在,则返回true

因此,目前您可以做的是,如果您知道您运行的是支持此功能的HTML5浏览器,您可以检查输入类型是否为“email”,以及是否存在“required”属性。(我暂时不知道该怎么做,但也许其他人可以建议一种方法)

另一件需要确保的事情是提供一个无效的值,并确保表单不允许自己被提交。e、 g.验证是强制执行的,还是仅仅是建议性的。(不要忘记检查服务器端,无论如何都要使用curl或httparty之类的工具提交无效数据,因为恶意用户可以轻松绕过任何内置浏览器验证,并使用伪造的或甚至是“恶意”的值提交该表单,以引起缓冲区溢出或注入攻击。任何站点都不应完全依赖客户端vali)

当然,要考虑的另一件事是,如果用户在浏览器上不支持那个特定的验证功能,那么页面会做什么呢?我假设是某种客户端javascript和显示的消息

在这种情况下,这实际上取决于消息“出现”的方式。在我正在测试的应用程序中,这类消息恰好位于一个方便的div中,具有由css控制的唯一类,这些类通常被隐藏,然后在客户端JS检测到需要为用户显示消息时设置为display。当然,我也有类似的测试。这里有一个例子,表示同意我们的条款和条件的人。(注意:我们使用Cucumber和testfactorygem来处理页面对象和数据对象)

让我们从消息开始,以及右键单击.examine-element显示的内容

grower\u selfregister.feature
文件中的场景如下所示

Scenario: self registering grower is required to agree to terms and conditions
  Given I am a unregistered grower visiting www.climate.com
  When I try to self-register without agreeing to the terms and conditions
  Then I am informed that Acceptance of the terms and conditions is required
  And I remain on the register page
关键步骤包括:

When /^I try to self-register without agreeing to the terms and conditions$/ do
  @my_user.self_register(:agree_to_terms => FALSE)
end

Then /^I am informed that Acceptance of the terms and conditions is required$/ do
  on Register do |page|
    page.agree_to_terms_required_message.should be_visible
  end
end

Then /^I remain on the register page$/ do
  on Register do |page|
    #ToDo change this to checking the page title (or have the page object do it) once we get titles
    page.url.should == "#{$test_site}/preso/register.html"
  end
end
register.rb
页面对象的相关部分如下

class Register < BasePage

  #bunch of other element definitions removed for brevity

  element(:agree_to_terms_required_message) {|b|b.div(:class => "terms-error")}

end
类寄存器“terms error”)}
结束
这有助于提供一个例子吗


注意:第二次验证(停留在页面上)是多余的,因为如果我不在页面上,我不太可能看到消息。但是,它为场景中描述的预期用户体验增加了清晰性。另外,如果实现在何处更改,例如如果决定使用javascript警报之类的内容,那么很可能很重要的一点是,一旦取消,验证它(这可能是“我看到消息”步骤可能会做的)用户无论如何都没有进入该站点

我还没有找到检查实际错误消息的方法。但是,在输入非电子邮件后,可以使用
:invalid
CSS伪选择器检查输入字段是否无效

WebElement invalidInput = driver.findElement(By.cssSelector("input:invalid"));
assertThat(invalidInput.isDisplayed(), is(true));

警告是否出现在页面上?我的第一个猜测是通过firebug获取它的ID,然后在页面上出现警告时使用它-您可以在浏览器窗口中看到它,但它不会出现在页面上-DOM中没有新的显示。魔术。:)事实上,我认为这没有意义,因为这意味着测试第三方,而不是web应用。那么,这是否意味着警告总是在那里,而不是被页面隐藏?如果不是的话,我同意@p0deje-对我来说测试第三方应用程序也没有意义,这是不同的。这不是javascript客户端验证,而是一个新的HTML5功能,浏览器根据输入“类型”和字段是否定义了新的“必需”属性进行验证。因此,给用户的实际演示是非常主观的,如果开发人员编写了(我认为使用psuedoclasses?)中的代码,那么可以通过CSS来加强演示,以获取更多信息