3

Selenium WebDriver を使用して、二重投稿防止動作を持つフォームをテストしています。ユーザーが誤って同じものを 2 回投稿しないように、クリック時にボタンを無効にする単純な JavaScript がいくつかあります。

これをどのようにテストしますか?

問題はbutton.click()、次のページが読み込まれるまでブロックされることです。その時点で、前のページのボタンについて何もアサートできません。何らかの.click()方法で をノンブロッキングにしたとしても、固有の競合状態があります。ブラウザ/javascript がテスト システムよりもはるかに高速な場合、テストがボタンに関する何かをアサートする前に、ページをアンロードできます。

JavaScript インジェクション ハックのないソリューションのボーナス ポイント。

4

1 に答える 1

5

Escすべてのブラウザーと OS でページの読み込みをキャンセルするという仮定に基づいて、これは機能するはずです。

WebElement input = driver.findElement(By.tagName("input")); 
input.sendKeys(Keys.ENTER, Keys.ESCAPE);
Assert.assertFalse(input.isEnabled());

Enterボタンにとを立て続けに送信Escするため、JavaScript が起動されますが、ページの読み込みが開始される可能性はありません。唯一の問題は、これで次のページに移動できないことです。新しいフォームを更新して送信しない限り、テストしてください。しかし、とにかく一度に 1 つの機能だけをテストする必要があるので、問題ありません ;-)。


編集(コメントに対処するため)

実はそうです!Advanced User Interactions API ( JavaDocs ) を使用して、クリックとEscキーを同時に送信することを試みることができます。この方法でノンブロッキング クリックを実現することもできます。

とにかく、このアプローチはまだ2つのリクエストを送信しますが、これは想像できる最速の方法ではありませんが、私のテストに(かろうじて)合格することもあるので、試してみてください。

WebElement input = driver.findElement(By.tagName("input"));
new Actions(driver)
        .click(input)
        .sendKeys(input, Keys.ESCAPE)
        .perform();

テスト環境: ローカルに保存されたファイルと Selenium 2.29.1 を使用する IE8 および FF18。XP SP3 を獲得します。テスト ファイルは次のようになります。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>Test</title>
</head>
<body>
    <a href="http://google.com/">
        <input type="button" value="Hello." onclick="this.disabled='true';" />
    </a>
</body>
</html>
于 2013-01-24T01:57:26.937 に答える