我一直在嘗試製作一個小程序,它將與網站(瀏覽器遊戲更精確)進行交互,從不同頁面獲取一些信息並將其打印到一個GUI。當遍歷頁面使用for-each循環時硒元素陳舊元素
我得到了印刷工作正常,我可以登錄沒有問題,並導航網站。但是當我嘗試獲取我需要的數據(這是使用for-each循環完成的)硒繼續拋出一個「元素似乎是陳舊」的錯誤並終止應用程序。
我從第一個星球得到的數據沒問題,但這就是它結束的地方。下面的代碼片段:
public void getResources()
{
List<WebElement> planets = driver.findElements(By.className("smallplanet"));
String name;
int metal;
int crystal;
int deuterium;
int energy;
boolean firstPlanet = true;
for(WebElement planet : planets)
{
if(!firstPlanet)
{
WebElement tag = planet.findElement(By.tagName("a"));
tag.click();
} else
{
firstPlanet = false;
}
name = planet.findElement(By.className("planet-name")).getText();
System.out.println(name);
metal = Integer.parseInt(driver.findElement(By.id("resources_metal")).getText().replace(".", ""));
crystal = Integer.parseInt(driver.findElement(By.id("resources_crystal")).getText().replace(".", ""));
deuterium = Integer.parseInt(driver.findElement(By.id("resources_deuterium")).getText().replace(".", ""));
energy = Integer.parseInt(driver.findElement(By.id("resources_energy")).getText().replace(".", ""));
resources.add(new ResourceLine(name, metal, crystal, deuterium, energy));
}
}
,這是錯誤:
Element appears to be stale. Did you navigate away from the page that contained it? And is the current window focussed the same as the one holding this element?
For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html
Build info: version: '2.35.0', revision: 'c916b9d', time: '2013-08-12 15:42:01'
System info: os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.7.0_03'
Driver info: driver.version: HtmlUnitDriver
我想,這可能是因爲硒是沒有給予足夠的時間來加載的頁面?但是我認爲硒在等待頁面下載完成的同時暫停了EDT? 我知道它在我登錄時會這樣做,因爲我的用戶界面現在在同一個線程上運行,並且在硒完成加載頁面之前它不會更新。
在任何情況下,我已經嘗試使用Thread.sleep()
和driver.wait不同長度在50和500之間,但都沒有任何效果。
(注:我支持JavaScript的HtmlUnitDriver)
編輯:我一直在調試多一些,現在我可以確認它是不是因爲硒是沒有給予足夠的時間來加載頁面。該程序不會等待新的頁面加載,但由於一些奇怪的原因,它仍然拋出異常......
另一個編輯:
我現在包裹在一個while循環,保持執行相同的嘗試每個findElement聲明只要拋出異常就可以捕獲塊。 但它只是一個無限循環,不斷拋出相同的陳舊元素異常。
我可能還想補充說,頁面確實是「自我刷新」。如在,我試圖檢索每500毫秒左右更新一次的值。
我在使用了driver.findElement(通過...)的換內的任何線精確定位錯誤循環。 每頁*看起來相同,具有相同的項目只是不同的值。 這樣的想法是: - 獲取資源形成第一行星 - 去下一個星球 - 獲取資源 - 去下一個星球 - 漂洗,重複。 所以實際的星球名稱(行星列表裏面的那個)永遠不會改變。但它確實給了我一個主意。 – killernerd
頁面的外觀如何並不重要。他們的HTML可能完全一樣。但它們是不同的頁面,不同的DOM。所以很自然你會得到這個例外。 – JacekM
原來你一直都是...... 改變了代碼,所以它現在每刷新一次tag.click()後刷新行星列表(基本上就像你說的),它就像一個魅力! 感謝您的幫助:) – killernerd