2013-03-19 46 views
0

我正在努力解決StaleElementReferenceException問題。我已經看到了很多關於這個話題的討論,但是我一直無法找到解決我面臨的問題的解決方案。StaleElementReference異常

測試是獲取網頁頁腳上的所有鏈接,然後通過單擊並驗證頁面標題來驗證鏈接是否處於活動狀態。

首先,我發現&將所有鏈接存儲在數組列表中。我將鏈接名稱與從數據庫中檢索的值進行比較。然後,對於每個鏈接,我點擊它並驗證頁面標題。然後使用'driver.navigate.back()',回到原始頁面並繼續其餘鏈接。

但是,當控件返回到頁面時,會發生StaleElementReferenceException

任何人都可以建議我一個出路嗎?

感謝, Anuj

回答

2

當你存儲所有在頁腳你抓住這些元素,因爲它們是在那個時間點的鏈接。在導航到不同頁面時,這些特定元素不再存在。當你回到後面時,這些元素重新創建。

儘管元素通過標識符是相同的,但它們是不同的實例,因此數組中的舊元素是「陳舊」的。

我建議只存儲鏈接標識符(不是鏈接元素本身)作爲字符串,然後在每次頁面加載時搜索它們。

+1

這是絕對正確的。另一種選擇是在新窗口或標籤中打開鏈接。這樣主窗口仍然會保持元素的正確實例。 – aimbire 2013-03-20 17:44:35

0

我面臨類似的問題,在我的情況下,當我在文本框中鍵入某些內容時,它會導航到另一個頁面,所以當我回到上一頁時,該對象變得陳舊。

因此,這是導致例外,我處理得再次初始化要素如下 -

PageFactory.initElements(driver, Test.class); 

所以,當你瀏覽,請確認您再次初始化該頁面的所有元素,使該對象不會變陳舊。

0

您可以處理要和未來的新標籤如下:

字符串baseHandle = driver.getWindowHandle();

    Set<String> sr = driver.getWindowHandles(); 

        if (sr.size()>1){ 


        Set<String> sr1 = driver.getWindowHandles(); 
        sr1.remove(baseHandle); 


        Iterator itr = sr1.iterator(); 

        driver.switchTo().window(itr.next().toString()); 

        System.out.println("Page Title is : " + driver.getTitle()); 

        driver.close(); 

        driver.switchTo().window(baseHandle);