8

このエラーの原因であると思われる別の質問を作成しました: Selenium Firefox Driver は、親にオーバーフローがあるときにモーダルが表示されないと見なすのはなぜですか?

Selenium バージョン 2.33.0
Firefox ドライバー

エラーの原因となるコード:

        System.Threading.Thread.Sleep(5000);
        var dimentions = driver.Manage().Window.Size;
        var field = driver.FindElement(By.Id("addEmployees-password")); //displayed is true
        field.Click(); //works fine
        var element = driver.FindElement(By.Id(buttonName)); //displayed is false
        element.Click(); //errors out

クリックしようとしているボタン:

<div id="addEmployees" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="addEmployeesLabel" aria-hidden="true">

    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
        <h3>Add Employee</h3>
    </div>

    <div class="modal-body">
        <p class="alert alert-info">
            <input name="addEmployees-username" id="addEmployees-username" />
            <input name="addEmployees-password" id="addEmployees-password" type="password" />
            <input name="addEmployees-employee" id="addEmployees-employee" />
        </p>
    </div>

    <div class="modal-footer">
        <button name="addEmployees-add" id="addEmployees-add" type="button" class="btn" data-ng-click="submit()">Add</button>
    </div>

</div>
  • 呼び出しをFindElementsthen に変更すると、1 つの要素が取得されるため、ページには他に何もありません。
  • FindElementボタンの直前に発生するフィールドに I がある場合addEmployees-employee、たとえばaddEmployees-employeedisplayed
  • ブラウザ自体では問題なく表示されます。実際にボタンをクリックするだけで目的の動作が実行されますが、Web ドライバは表示された要素を考慮することを拒否します。

一方のフィールドは表示されていると見なされ、もう一方のフィールドは表示されていないのはどうしてですか?

ここに画像の説明を入力

右下に追加ボタンがあるモーダル、他のすべての要素が表示されます = true

ウィンドウ サイズは 1200x645 perdriver.Manage().Window.Size;
要素の位置は: 800x355y per 要素の寸法 driver.FindElement(By.Id(buttonName)).Location
は: 51x30 per driver.FindElement(By.Id(buttonName)).Size
password 要素の位置は: 552x233y per driver.FindElement(By.Id("addEmployees-password")).Size

4

5 に答える 5

5

ブライアンの答えは正しかった: Thread.Sleep() に対して明示的な待機を使用する。Sleep() は一般的に脆く、不必要に 5 秒を失うだけでなく、自動化されたテストにとって本当に腐った方法です。(それを学ぶのに長い時間がかかったので、そこにいるのはあなただけではありません。)

暗黙の待機を回避します。これらは通常、モーダルなどの遷移がアクティブになるためではなく、DOM に追加される新しいアイテムに対して機能します。

明示的な待機には、これらの問題を回避できる優れた一連の ExpectedConditions ( Javadox で詳しく説明されています) があります。次のアクションに必要な状態に一致する ExpectedCondition を使用します。

また、このトピックに関する Ian Rose のすばらしいブログ投稿も参照してください。

于 2013-07-15T22:34:31.650 に答える