2012-02-29 14 views
5

私がテストしているウェブページがノックアウトを使用しています。私たちのサイトの他のページで、現在ノックアウトを使用していない私は同じ問題を抱えていません。私が持っているシナリオは、ページが開く場所です。私はさまざまな必須フィールドに入力し、保存ボタンをクリックします。最後のテキストフィールドに値が入力されてから保存ボタンがクリックされるまでの間に、以前に値を持つフィールドがクリアされ、スクリプトを続行できなくなります。ここで私が実行しているコードの例です:セレンのwebdriverがsendKeysに以前に入力された後にフィールドをクリアしています

driver.findElement(By.id("sku")).clear(); 
driver.findElement(By.id("sku")).sendKeys(itemNo); 
driver.findElement(By.id("desktopThankYouPage")).clear(); 
driver.findElement(By.id("desktopThankYouPage")).sendKeys(downloadUrl); 
driver.findElement(By.id("mobileThankYouPage")).clear(); 
driver.findElement(By.id("mobileThankYouPage")).sendKeys(mobileDownloadUrl); 
driver.findElement(By.id("initialPrice")).clear(); 
driver.findElement(By.id("initialPrice")).sendKeys(initialPrice); 
driver.findElement(By.id("submitSiteChanges")).click(); 

私はそれが最後のフィールドにテキストを入力する時、それは以前にそれらのテキストがクリアされたフィールドを保存クリックするまでの間に、言ったように私のテストは失敗します。問題は必ずしも起こらないということです。時にはテストは正常に実行され、それ以外の場合は正常に実行されることがあります。

私はThread.sleep(x)を入れてみました。特定のポイントで一時停止すると問題が解決するかどうかを確認することができます。私はまた、javascriptを使用して、バックグラウンドで実行中のAjaxを待つことを試みました。また、暗黙的にdriver.manage()。timeouts()。implicitlyWait(10、TimeUnit.SECONDS)を待機させてください。それのどれもが一見違いはありませんでした。

私はセレンサーバのバージョン2.13を実行しているし、すべての私のテストは、Firefox 8

に、この上の任意のヘルプを実行していただければ幸いです!

+0

設定されている値が実際に設定されていることをどのように確認しましたか。提出をクリックした後、あなたのKOコードはどうなりますか?テンプレートの一部としてレンダリングされたKOにバインドされたDOM要素はありますか? – madcapnmckay

+0

はい、送信ボタンをクリックする前にフィールドに値が存在することを確認しました。実際にはテストが合格することがあります。送信ボタンはバインドされたオブジェクトを受け取り、それをJSONに変換し、ajax経由でAPIに送信します。 JSONを作成する前に、Webドライバがいくつかのフィールドをクリアしているようです。 –

+0

私は、ウェブドライバがフィールドをクリアしていることに疑いがあります。可能性としては、タイミング自体の問題や、イベントハンドラコードのバグなどのために、ページ自体がフィールドをクリアしている可能性があります。いずれかのフィールドにテキストを入力する前に非常に長いスリープ時間(30秒)を追加して、タイミングの問題を完全に排除しましたか?タイミングの問題を除外するために、各フィールドにテキストを入力する間に2秒間の遅延を追加しましたか? –

答えて

1

私はまったく同じ問題を抱えていました。私は、あなたのコードはChromeでうまく動作しますが、Firefoxではうまく動作しないと思っています。

とにかく、問題はSeleniumが実際のユーザーと同じように振る舞いませんし、同じイベントをトリガーしないということです。フォームを「提出する」と、テキストエリアに「変更」イベントが実行されないことがあります。つまり、変更されません。

"change"イベントを使用してフォームからモデルを更新するBackbone.modelbindingのテストでも同じ問題が発生しました。ノックアウトでは「変更」イベントも使用されますが、幸いにも「キーアップ」イベントも使用できます。 valueUpdate in the docsを参照してください:

とにかく
<input data-bind="value: someValue, valueUpdate: 'keyup'" /> 

、それは再現性私のためにそれを解決して、私が行っていることを持っていたら、任意のスリープを必要とするdidntの。欠点は、テストを行うためには、プロダクションで必要以上にイベントを実行することです。別の欠点は、値が変更されたときにコードを実行したい場合、フィールド変更あたり1つのイベントではなく、キーの押下ごとに1つのイベントが発生することです。

セレンが自分で変更イベントを発生させる別の解決策があります。たとえば、Selenium IE change event not firedです。それはまた最適ではありませんが、何ができますか?

また、ボタンをクリックする前にフォーカスを置くこともできます。それがうまくいくかどうかわからない、私はそれを試していない。

4

Firefoxにはbugがあり、ブラウザウィンドウにフォーカスが外れている間に一部のイベントが実行されないようにします。これは、オートメーションテストを実行しているときに問題になる可能性があります。これは、ウィンドウのフォーカスが合っていなくてもタイピングしている可能性があります。

ポイントはノックアウトモデルの更新が(デフォルトで)changeイベントでトリガーされるということです。それが実行されていない場合、それは基礎となるモデルは最新ではありません。この問題を解決するには

私は私のテストにはJavaScriptを注入し、「手動」変更イベントをトリガー:

//suppose "element" is an input field 
element.sendKeys("value"); 
JavascriptExecutor jsExecutor = (JavascriptExecutor) driver; 
jsExecutor.executeScript("$(arguments[0]).change();", element); 

あなたは私が変更イベントをトリガするためにjQueryを使用している、気づいたかもしれませんが。アプリでjQueryを使用していない場合は、hereにvanilla javascriptを使用してトリガーする方法を確認できます。

誰かを助ける希望。

+0

それは確かに私を助けた!とFWIWは、Cでそれは 'var jsExecutor =(IJavaScriptExecutor)ドライバです。 jsExecutor.ExecuteScript( "$(arguments [0])。change();"、要素); ' – LosManos

関連する問題