JavaでSeleniumWebDriverを使用しています。
ウェブページからすべてのリンクを取得し、各リンクを1つずつクリックしようとしています。以下のエラーが発生します:
エラーorg.openqa.Selenium.StaleElementReferenceException:要素がキャッシュに見つかりません-検索されてからページが変更された可能性がありますコマンド期間またはタイムアウト:30.01秒このエラーのドキュメントについては、次のURLにアクセスしてください: http:// seleniumhq.org/exceptions/stale_element_reference.html ビルド情報:バージョン: '2.25.0'、リビジョン: '17482'、時間: '2012-07-18 21:09:54'
そしてここに私のコードがあります:
public void getLinks()throws Exception{
try {
List<WebElement> links = driver.findElements(By.tagName("a"));
int linkcount = links.size();
System.out.println(links.size());
for (WebElement myElement : links){
String link = myElement.getText();
System.out.println(link);
System.out.println(myElement);
if (link !=""){
myElement.click();
Thread.sleep(2000);
System.out.println("third");
}
//Thread.sleep(5000);
}
}catch (Exception e){
System.out.println("error "+e);
}
}
実際、出力に表示されています
[[FirefoxDriver:firefox on XP(ce0da229-f77b-4fb8-b017-df517845fa78)]->タグ名:a]
リンクとして、これらのフォームの結果を削除したいと思います。
次のシナリオを用意するのは良い考えではありません。
_for (WebElement element : webDriver.findElements(locator.getBy())){
element.click();
}
_
どうして? element.click();
が他の見つかった要素に影響を与えないという保証はないため、DOM
が変更される可能性があり、したがってStaleElementReferenceException
になります。
次のシナリオを使用することをお勧めします。
_int numberOfElementsFound = getNumberOfElementsFound(locator);
for (int pos = 0; pos < numberOfElementsFound; pos++) {
getElementWithIndex(locator, pos).click();
}
_
前のクリックで何らかの影響があったとしても、常にWebElement
を更新するので、これはより良い方法です。
編集:例を追加
_ public int getNumberOfElementsFound(By by) {
return webDriver.findElements(by).size();
}
public WebElement getElementWithIndex(By by, int pos) {
return webDriver.findElements(by).get(pos);
}
_
十分であることを願っています。
クレジットは「ローン」になります。
「古い例外」も発生しているので、「ローン」の回答を使用して完全に機能します。結果ページから各リンクをクリックする方法を誰かが知る必要がある場合は、これを試してください(Java)
clickAllHyperLinksByTagName("h3");
ここで、「h3」タグにはハイパーリンクが含まれています
public static void clickAllHyperLinksByTagName(String tagName){
int numberOfElementsFound = getNumberOfElementsFound(By.tagName(tagName));
System.out.println(numberOfElementsFound);
for (int pos = 0; pos < numberOfElementsFound; pos++) {
getElementWithIndex(By.tagName(tagName), pos).click();
driver.navigate().back();
}
}
public static int getNumberOfElementsFound(By by) {
return driver.findElements(by).size();
}
public static WebElement getElementWithIndex(By by, int pos) {
return driver.findElements(by).get(pos);
}
WebDriver _driver = new InternetExplorerDriver();
_driver.navigate().to("http://www.google.co.in/");
List <WebElement> alllinks = _driver.findElements(By.tagName("a"));
for(int i=0;i<alllinks.size();i++)
System.out.println(alllinks.get(i).getText());
for(int i=0;i<alllinks.size();i++){
alllinks.get(i).click();
_driver.navigate().back();
}
WebDriver.get()
の代わりにWebElement.click()
を使用してリンクをテストしても問題がない場合は、別の方法として、見つかった各href
のWebElement
値を保存します。別のリストにあります。このようにして、最初のWebElement.click()
でナビゲートした後、後続のStaleElementReferenceException
sを再利用しようとしないため、WebElement
を回避します。
基本的な例:
List<String> hrefs = new ArrayList<String>();
List<WebElement> anchors = driver.findElements(By.tagName("a"));
for ( WebElement anchor : anchors ) {
hrefs.add(anchor.getAttribute("href"));
}
for ( String href : hrefs ) {
driver.get(href);
}
//extract the link texts of each link element
for (WebElement elements : linkElements) {
linkTexts[i] = elements.getText();
i++;
}
//test each link
for (String t : linkTexts) {
driver.findElement(By.linkText(t)).click();
if (driver.getTitle().equals(notWorkingUrlTitle )) {
System.out.println("\"" + t + "\""
+ " is not working.");
} else {
System.out.println("\"" + t + "\""
+ " is working.");
}
driver.navigate().back();
}
driver.quit();
}
完全な説明についてはこれを読んでください [〜#〜] post [〜#〜]
List <WebElement> links = driver.findElements(By.tagName("a"));
int linkCount=links.size();
System.out.println("Total number of page on the webpage:"+ linkCount);
String[] texts=new String[linkCount];
int t=0;
for (WebElement text:links){
texts[t]=text.getText();//extract text from link and put in Array
//System.out.println(texts[t]);
t++;
}
for (String clicks:texts) {
driver.findElement(By.linkText(clicks)).click();
if (driver.getTitle().equals("notWorkingUrlTitle" )) {
System.out.println("\"" + t + "\""
+ " is not working.");
} else {
System.out.println("\"" + t + "\""
+ " is working.");
}
driver.navigate().back();
}
driver.quit();