2017-04-09 28 views
0

我正在爲鼠標懸停工作,我想通過單擊每個使用for循環的鏈接來測試所有鏈接的工作條件。在我的程序中,迭代進行一次,對於下一次迭代它不是工作,展示了「StaleElementReferenceException」 .......... 如果需要的話請不要在代碼修改....如何處理StaleElementReferenceException

public static void main(String[] args) throws IOException 
{ 
    WebDriver driver = new FirefoxDriver(); 
Autoit.Authenti(driver); 
    driver.manage().window().maximize(); 

    driver.manage().timeouts().implicitlyWait(20,TimeUnit.SECONDS); 

    driver.get("http://staging.zenrays.com"); 


    Actions a1=new Actions(driver); 
    WebElement cl=driver.findElement(By.xpath(".//*[@id='menu-450-2']/a")); 
    a1.moveToElement(cl).perform(); 

    WebDriverWait wait =new WebDriverWait(driver, 30); 



    List<WebElement> links=driver.findElements(By.xpath("//a[contains(@class,'sf-depth-2')]")); 

      for(int i=0;i<=links.size()-1;i++) 
      { 

       links.get(i).click(); 

      driver.navigate().back(); 

       } 
       } 
      } 
+0

您能提供一些關於您想要執行的確切步驟的更多信息嗎? – DebanjanB

+0

請訪問鏈接(「zenrays.com」),在那裏您可以看到課程鏈接(頁面標題),其鼠標懸停鏈接,並有13個子鏈接,我想通過單擊和測試每個子鏈接導航回到主頁,以便我用於循環。它正在爲第一個子鏈接和導航返回主頁也爲第二次迭代它顯示異常.......... – swamynathan

回答

0

您可以在代碼中使用以下修改: -

List<WebElement> links=driver.findElements(By.xpath("//a[contains(@class,'sf-depth-2')]")); 

     for(int i=0;i<links.size();i++) 
     { 
    List<WebElement> allLinks=driver.findElements(By.xpath("//a[contains(@class,'sf-depth-2')]")); 
      allLinks.get(i).click(); 

     driver.navigate().back(); 

      } 
+0

K肯定我試試這會更新你 – swamynathan

1

瞭解一個基本的東西:staleElementReferenceException,通過它的名字表明對頁面上的元素的引用是陳舊的(丟失)。如果這些元素可用,則只需再次引用這些元素,在這種情況下,在頁面已被刷新時適用。做兩兩件事:

  1. 一旦頁面被刷新(當導航回),使用顯式的等待,直到你預期元素是可見的
  2. 然後,新是指你的元素(您已使用XPath的定位器在這些情況下

再次與

  • 作爲一種清潔和優雅的代碼使用try-catch塊)你想工作,我不會直接給你的代碼:)試試吧,回來與你的代碼。

    參考here 它是這個特定的異常

    一件事可能發生的情況解釋清楚:你的for循環提供了IndexOutOfBoundsException。也可以修改它