2012-04-24 47 views
1

私の問題の解決策があるかどうかは不明ですが、残念ながらその記事や情報が見つかりませんでした。webdriverのjavascript変数を上書きする

状況は次のとおりです。私たちにはjQueryを大量に使用するサイトがあり、サイトの一部を5秒または10秒ごとにリフレッシュするサービスがあります。

"Element not found in the cache - perhaps the page has changed since it was looked up" 

インターネットによるWebElementが初期化されているときに、私が使用したい時にDOMツリーが一瞬の間で変更されたとき、私はこのエラーを得た:原因私はwebdriverをからこのエラーを得たこの時間の半分にそれは、例えば、クリックイベントを実行する。

私たちの開発者によると、jqueryソリューションには、ページをリフレッシュするかどうかを制御する変数があります。だから、私の問題を解決するために、私はこの変数を上書きする必要があります。この変数をjQueryが理解できるように上書きする必要があります。この定義がこのコンテキストで適切であれば、同じインスタンス内にあることを意味します。

私は可能かどうか質問したいと思いますか?もしそうなら、私は小さな事例を聞きたいと思っています。

ありがとうございます!

アンドラーシュ

+0

コード:終了したら

は、あなたがセレンからJavaScriptを実行することによって、(そのページがさわやかでやってAJAXを続けることができます)所定の場所に戻りXHRオブジェクトを置くことができますか?サンプル?何か? – RASG

+0

クライアントが所有しているため、コードを提供できません。一方、サンプルコードが何に含まれるべきかわからないので、必要ではありません。私は問題が何であるかを説明すると思います。もしそうでなければ、私はそれをもう一度やり直すよりも。 :) – SayusiAndo

+0

あなたの質問は実際の実装ではなく、テストケースに関係していますか? – madflow

答えて

1

あなたは私のアプローチを試すことができます - 私は、ページの読み込みかもしれない状況のために私自身のラッパーを作成しました。以下のコードの部分は、ループ内の要素を3秒間検索します(設定可能)。ところで、以下のdriver変数は、コード内のWebDriver

private WebElement foundElement; 
public WebElement find(By by){ 
    for (int milis=0; milis<3000; milis = milis+200){ 
     try{ 
      foundElement = driver.findElement(by); 
     }catch (Exception e){ 
      try { 
       Thread.sleep(200); 
      } catch (InterruptedException e1) { 
       e1.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
      } 
     } 
    } 

    return foundElement; 

} 

以降のインスタンスである:

WebElement submitButton = find(By.id("submitNewBid")); 
submitButton.click(); 
+0

私はあなたのソリューションのポイントを見て、ありがとう、それは便利です! – SayusiAndo

0

私はそれが可能であると信じています。 C#の例:

((IJavaScriptExecutor)driver).ExecuteScript("window.$('.class').data('var') = 0;") 
4

私はAlehにしか同意できません。

JavaScriptExecutorを使用することは、このような問題を処理する唯一の方法です。

jQuery jNiceライブラリに問題があり、他の解決策が見つかりませんでした。ここで

は、テキストフィールドを充填するためのJavaの例です:

JavascriptExecutor js = (JavascriptExecutor) webDriver; 
js.executeScript("document.getElementsByName('<field_name_gets_here>')[0].value='" + your_value + "'"); 
2

あなたが言及したJavaScript変数がグローバルである場合は、[はい - あなたはセレンからJavaScriptを実行することによって、それを上書きすることができます。たとえば、その変数がdoRefreshと呼び出されている場合は、JSを次のように実行して上書きすることができます。doRefresh = false; from Selenium

その変数がグローバルでない場合、上記は機能しません。しかし、問題の要素がajaxを介して動的にロードされるように思えます - この場合、xhrオブジェクトはグローバルで、代わりにアクセスできます。

だから、最初のあなたはxhrオブジェクトのローカルコピーを作成することができ、その後、セレンからJavaScriptを実行することにより、(それを効果的に無効にする)、元を上書き:

// create a copy of the xhr object for later use 
var xhrHolder = window.XMLHttpRequest; 

// overwrite the original object to disable it 
window.XMLHttpRequest = {}; 

通常どおりに続いてセレンを経由して、あなたの要素を見つけます。そして、あなたのテストを続行してください。

// put the xhr object back 
window.XMLHttpRequest = xhrHolder; 
関連する問題