ajaxベースのテキストフィールドに部分的な値を入力し、リストに期待される内容が含まれていることを確認する必要があるテストケースがあります。含まれている場合は、コンテンツを選択します。これを機能させる方法はありますか?
17 に答える
typeコマンドでは、オートコンプリートをトリガーするのに十分でない場合があります。Dave Webbの提案は、それ以外の点では的を射ています。私の唯一の追加は、 typeKeysコマンドが必要になる可能性があることです。これにより、わずかに異なるJavaScriptイベントが発生し、オートコンプリートウィジェットがトリガーされる可能性が高くなります。
私は次のようにこれを行います:
type
をクリックして、テキスト フィールドに値を入力します。waitForTextPresent
またはverifyTextPresent
オートコンプリートの内容を確認するにはclick
またはmouseDown
、オートコンプリート リストの項目をクリックします。
トリックは、決勝戦をclick
適切な場所にすることです。期待するテキストを検索する XPath 式を使用できるはずです。
WebDriverの場合、これを試してください
以下のコードは、自動提案からテキストを自動的に検索するためのものです。主にリスト項目用。
driver.findElement(By.id("your searchBox")).sendKeys("your partial keyword");
Thread.sleep(3000);
List <WebElement> listItems = driver.findElements(By.xpath("your list item locator"));
listItems.get(0).click();
driver.findElement(By.id("your searchButton")).click();
私は最近、まさにこのトピックに関する HOWTO を書きました - Selenium を使用して AJAX 駆動の JQuery オートコンプリート メニューをテストします。
IDEで次のシーケンスを使用しましたが、
- タイプキー
- waitForTextPresent
- マウスオーバー
- クリックアット
そしてうまくいった
あなたの質問は少しあいまいです。
ほとんどのブラウザーは、フィールドの名前に基づいた値のキャッシュを保持しています。これは、以前にサイトにアクセスしたことがなくても、ブラウザーによってオートコンプリートとして提案されている値です。この機能はすべてのブラウザーで非標準であり、セレンがこれを検出/分析する標準的な方法はありません。それを行うことはできますが、値を自分で決定する JavaScript 関数を作成する必要があります。次に、セレンで「eval」を使用してこれらの関数を実行できます。これらの値をブラウザー間で互換性のある方法で伝えることができる js ライブラリは見たことがありません。
もう 1 つの方法は、ajax を使用して、部分的に入力された値をサーバー側で送信することです。この場合、テキスト ボックスに値を入力し、期待値が表示されることをアサートするだけです。通常、オートコンプリートの提案はクライアント側のレイヤーに表示されます。
typeKeysを実行して機能させる前に、フィールドにフォーカスする必要があることがわかりました。
TypeKeys が機能しないことがあります。この時点で、keyDown を使用できます
入力ボックスをクリックして、ボックスに value と keyDown を入力します。
パトリックの答えは間違いなく重要です。Jquery UI の最後のバージョンでは focus と mouseDown が必要であることもわかりました。Sauce Labs で実行されていることを確認できるように、テストのビデオを録画しました 。
type の代わりに typeKeys を使用してください。クリックの代わりに mouseDown も使用してください。それは正常に動作します。
これらのコマンドは、Selenium IDE 2.9.1 バージョンでオートコンプリート テキスト フィールドに使用しました。sendKeys (ロケータ、値) clickAt(ロケータ、coordString) クリック(ロケータ)
typeKeys コマンドのヘルプ テキストには、次のように書かれています。
場合によっては、単純な「type」コマンドを使用してフィールドの値を設定し、次に「typeKeys」コマンドを使用して、入力した内容に対応するキーストローク イベントを送信する必要がある場合があります。
したがって、この組み合わせを使用してください
type(selector, text);
typeKeys(selector, text);
これはうまくいくようです。
Prashanth の答えを使用した少しのバリエーション:
/**
* Selects the element at position idx from the autocomplete combo, considering the partialKeyword
* @param driver
* @param element
* @param partialKeyword
* @param idx
* @throws InterruptedException
*/
public static void selectAutoCompleteValue(WebDriver driver, WebElement element, String partialKeyword, Integer idx) throws InterruptedException{
element.sendKeys(partialKeyword);
Thread.sleep(1000);
List <WebElement> listItems = driver.findElements(By.cssSelector(".ui-autocomplete-item.ui-autocomplete-list-item"));
listItems.get(idx).click();
}
お役に立てれば!
typeKeys に問題がありました。sendKeys が最終的な解決策になるようですが、まだ実験段階です。参照から:
このコマンドは実験的なものです。将来、typeKeys コマンドを置き換える可能性があります。
詳細に興味がある人のために、keyDown、keyUp、および keyPress イベントを起動しようとする typeKeys コマンドとは異なり、このコマンドは Selenium 2 のアトムに支えられており、はるかに堅牢な実装を提供します。未来。