8

给定一个简单的页面:

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

如果我在文本字段中输入任何不是电子邮件的内容并单击按钮,Please enter an email address则会出现消息。

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

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

关于 SO 的一个较早的相关问题是:如何使用黄瓜测试 HTML5 页面中的错误条件?

4

3 回答 3

4

你可以试试这样

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逻辑将根据字段的有效性返回真/假

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

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

于 2013-03-26T16:35:59.310 回答
4

我同意这开始接近“测试浏览器”了验证,这是你可以验证的。

在网络艺术方面有一些很好的背景

浏览器端验证是由特定输入类型(您可以通过 watir 的.type方法检查)和新required属性(可能更难检查)的组合触发的Watir 中的功能。我想我们可以使用一种.required?方法,该方法应该支持所有支持新“必需”属性的输入元素,并且如果存在“必需”属性,则返回 true。

因此,目前您可以做的是,如果您知道您在支持此功能的 HTML5 浏览器上运行,您可以检查输入类型是否为“电子邮件”以及是否存在“必需”属性。(我不知道如何做到这一点,但也许其他人可以提出一种方法)。

要确定的另一件事是提供无效值,并确保表单不允许自己被提交。例如,验证是强制执行的,还是仅仅是建议性的。(并且不要忘记通过使用 curl 或 httparty 之类的方式提交无效数据来检查服务器端,因为敌对用户可以轻松绕过任何浏览器验证并提交带有虚假甚至“敌对”值的表单以导致缓冲区溢出或注入攻击。任何站点都不应完全依赖客户端验证。)

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

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

让我们从消息开始,以及 right-click.examine-element 揭示的内容

我们注册页面上显示的消息

文件上的场景grower_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

Cucumber 的关键步骤是:

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

这有助于提供一个例子吗?

注意:很容易认为第二次验证(留在页面上)是多余的,因为如果我不在页面上,我不太可能看到该消息。但它增加了场景中描述的预期用户体验的清晰度此外,如果实施更改位置可能非常重要,例如,如果决定使用类似 javascript 警报之类的东西,那么验证这一点可能很重要一旦被解雇(“我看到消息”步骤可能会做的事情),用户无论如何都没有进入该网站。

于 2013-03-26T21:24:10.203 回答
2

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

WebElement invalidInput = driver.findElement(By.cssSelector("input:invalid"));
assertThat(invalidInput.isDisplayed(), is(true));
于 2015-04-09T20:59:08.503 回答