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ロジックは、フィールドの有効性に基づいてtrue/falseを返します

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

追伸:入力タグのIDは「a」だと思います

于 2013-03-26T16:35:59.310 に答える
4

これが「ブラウザのテスト」に近づき始めていることに同意します。コードがそのブラウザ機能に依存している場合は、サイトが適切なhtml(5)コードを生成して、ブラウザがそのレベルを希望していることを認識できるようにする必要があります。検証の、そしてそれはあなたが検証できるものです。

ウェブの芸術でこれに関するいくつかの良い背景

ブラウザ側の検証は、特定の入力タイプ(watirの.type方法で確認できます)と新しいrequired属性(確認が難しい場合があります)の組み合わせによってトリガーされます。これを考えると、実際には、新しい属性のかなり良い原因がここにあると思います。 Watirの機能。.required?新しい「required」属性をサポートするすべての入力要素でサポートされるべきメソッドを使用でき、その「required」属性が存在する場合はtrueを返すと思います。

したがって、現時点でできることは、この機能をサポートするHTML5ブラウザーで実行していることがわかっている場合、入力タイプが「email」であり、「required」属性が存在することを確認することです。(私はそれを行う方法についての考えを持っていませんが、おそらく他の誰かが方法を提案することができます)。

もう1つ確認する必要があるのは、無効な値を指定し、フォームがそれ自体を送信できないようにすることです。たとえば、検証が実施されているか、単なる助言です。(そして、curlやhttpartyなどを使用して無効なデータを送信することでサーバー側を確認することを忘れないでください。敵対的なユーザーは、ブラウザの検証を簡単にバイパスして、バッファを引き起こすように設計された偽の値または「敵対的な」値でそのフォームを送信する可能性があります。オーバーフローまたはインジェクション攻撃。クライアント側の検証のみに依存するサイトはありません。)

もちろん、考慮すべきもう1つのことは、ユーザーがその特定の検証機能をサポートしていないブラウザーを使用している場合、ページは何をするのかということです。ある種のクライアント側のJavaScriptと表示されるメッセージを想定しています。

その場合、それは実際にメッセージが「表示される」ようにされる方法に依存します。私がテストしているアプリでは、この種のメッセージは、cssによって制御される一意のクラスを持つ便利なdivにあり、通常は非表示になり、クライアント側の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

重要なキュウリの手順は次のとおりです。

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

それは例を提供するのに役立ちますか?

注:まだページにいない場合はメッセージが表示されない可能性があるため、2番目の検証(ページにとどまる)は冗長であると簡単に主張できます。ただし、シナリオで説明されている期待されるユーザーエクスペリエンスが明確になります。また、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 に答える