1

私の問題の解決策があるかどうかはわかりませんが、残念ながらそれに関する記事や情報は見つかりませんでした。

状況は以下です。jQuery を多用するサイトがあり、サイトの一部を 5 秒または 10 秒ごとに更新するサービスがあります。この半分の時間のために、WebDriver から次のエラーが発生しました。

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

インターネットによると、WebElement が初期化された時点と、それを使用してクリック イベントなどを実行する時点との間に DOM ツリーが変更されたときに、このエラーが発生しました。

開発者によると、jquery ソリューションには、ページを更新するかどうかを制御する変数があります。したがって、私の問題を解決するには、この変数を上書きする必要があります。jQueryがそれを理解できるように、この変数を上書きする必要があります。つまり、この定義がこのコンテキストで適切である場合、同じインスタンスで意味します。

それで、可能かどうかお聞きしたいのですが?もしそうなら、私は小さな例を聞きたいです。

前もって感謝します!

アンドラス

4

4 に答える 4

4

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

このような問題を処理するには、使用JavaScriptExecutorするしかありません。

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

以下は、テキスト フィールドに入力するための Java の例です。

JavascriptExecutor js = (JavascriptExecutor) webDriver;
js.executeScript("document.getElementsByName('<field_name_gets_here>')[0].value='" + your_value + "'");
于 2012-11-15T07:42:02.957 に答える
2

あなたが言及した JavaScript 変数がグローバルである場合、はい - Selenium から JavaScript を実行することで上書きできます。たとえば、その変数が という名前doRefreshの場合、次のように JS を実行することで上書きできます: doRefresh = false;from Selenium.

その変数がグローバルでない場合、上記は機能しません。ただし、問題の要素が ajax を介して動的に読み込まれる可能性があるようです。その場合、xhrオブジェクトはグローバルであり、代わりにアクセスできます。

そのため、最初にオブジェクトのローカル コピーを作成し、xhr次に Selenium から JavaScript を実行してオリジナルを上書きします (効果的に無効にします)。

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

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

次に、通常どおり Selenium を介して要素を見つけます。そして、テストを続行します。

終了したら、Selenium から JavaScript を実行して、xhr オブジェクトを元の位置に戻すことができます (ページの更新と ajax の実行を続行できるようにするため)。

// put the xhr object back
window.XMLHttpRequest = xhrHolder;
于 2013-05-31T20:12:53.563 に答える
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();
于 2012-04-24T15:00:23.073 に答える
0

それは可能だと思います。C# の例:

((IJavaScriptExecutor)driver).ExecuteScript("window.$('.class').data('var') = 0;")
于 2012-04-25T10:21:44.153 に答える