0

我在這裏的某種情況。調試StaleElementReference異常 - Selenium WebDriver

我有一個函數editNewUser()。

public void editNewUser() throws Exception 
    { 
     driver.findElement(adminModuleDD).click(); 
     wait.until(ExpectedConditions.visibilityOfElementLocated(searchRes)); 
     List<WebElement> elements = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(uNames)); 
     for(WebElement el : elements) 
     { 
      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"); 
      } 
     } 
    } 

UserName是在創建用戶期間在另一個函數中獲取值的公共字符串變量。

在這個腳本中,我瀏覽到一個包含用戶列表的頁面,我將所有用戶名存儲在List'elements'中,然後迭代列表中與文本匹配的用戶名的每個元素。

現在,在我的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()。等於(用戶名)條件爲true時,您正在執行操作以導航..因此,在列表中剩餘的元素改變其位置後,或者可能頁面已更改,而在硒緩存中找不到該元素作爲例外發生..如果你正在實現這一點,你應該打破循環,如果條件爲真。 –

回答

0

錯誤消息告訴你這個問題。一旦您在for循環中編輯了第一個「el」,頁面已經更改,頁面已經更新,所以Selenium已經失去了「元素」列表中剩餘元素的軌跡。

你需要找到另一種方式來跟蹤你正在循環的元素。我過去使用的技術是創建一個自定義對象來表示項目,在您的情況下可能是「用戶」。該對象非常聰明,可以在頁面上重新找到它自己。

+0

你能給我一個小例子的場景和它的工作? – Uziii

+0

如果您的代碼是以面向對象的方式編寫的,並且使用頁面對象模型,那將很簡單。列出新用戶的頁面將具有返回「用戶」對象列表的方法。每個「用戶」對象使用某個唯一的定位器(可能是一個ID號碼)識別用戶對象。 「用戶」類也有一個方法來找到該用戶的錨點...一個父div或東西,包裝頁面中的用戶記錄。所有的方法都是先找到錨點。 –