0

ここでは何らかの状況に陥っています。StaleElementReference例外のデバッグ - Selenium WebDriver

私はeditNewUser()関数を持っています。

UserNameは、ユーザーの作成中に別の関数で値を取得するパブリック文字列変数です。

このスクリプトでは、ユーザーリストを含むページに移動します。リスト '要素'にすべてのユーザー名を格納し、ユーザー名と一致するテキストのリストの各要素を繰り返し処理します。

私のtest_runスクリプトでは、editNewUser()の後に他のメソッドを呼び出す必要があります。

このメソッドはifブロック内で次のコマンドを実行します。

if(el.getText().equals(UserName)) 
    { 
     el.click(); 
     wait.until(ExpectedConditions.visibilityOfElementLocated(editUserHeading)); 
     driver.findElement(editUser).click(); 
     WebElement status_Dropdown = driver.findElement(By.xpath("//select[@id='systemUser_status']")); 
     Select status = new Select(status_Dropdown); 
     status.selectByVisibleText("Enabled"); 
    } 

しかし、すぐに次のメソッドが呼び出されるように、それが実行を停止し、org.openqa.selenium.StaleElementReferenceException: Element not found in the cache - perhaps the page has changed since it was looked up

スタックトレースは、ラインif(el.getText().equals(UserName))を指しスローされます。

ifブロック内のコマンドは実行されますが、この例外、イベントを受け取る理由を教えてください。

+0

el.getText()。equals(UserName)条件trueリスト内の残りの要素の位置が変更されたり、ページが変更された可能性があります。これはセレンキャッシュには例外として見つかりません発生しました..これを達成している場合、条件が真であればループを解除する必要があります。 –

答えて

0

エラーメッセージが表示されます。あなたのforループの最初の "el"を編集するとページが変更され、ページが更新されたため、Seleniumは "elements"リストの残りの要素の追跡を失いました。

ループする要素を追跡する別の方法を見つける必要があります。過去に私が使用してきたテクニックは、アイテムを表現するためのカスタムオブジェクトを作成することです。おそらく "User"でしょう。そのオブジェクトはスマートになり、ページ上でそれ自体を再発見することができます。

+0

小さなシナリオとその動作を教えてもらえますか? – Uziii

+0

コードがオブジェクト指向の方法で記述され、ページオブジェクトモデルを使用するのは簡単です。新しいユーザーがリストされているページには、「User」オブジェクトのリストを返すメソッドがあります。各「ユーザ」オブジェクトは、固有のロケータ、おそらくID番号を使用してユーザオブジェクトを認識します。 "User"クラスには、そのユーザーのアンカーを見つけるメソッドがあります。親divまたはユーザーレコードをページにラップするものです。すべての方法は、最初にそのアンカーを探すことから始まります。 –

関連する問題