2017-08-29 16 views
-1

我在第四次測試中得到了StaleElementReferenceException。我嘗試使用明確的等待來忽略異常,並等待該論壇中的類似問題中提出的可點擊元素ref:How to avoid "StaleElementReferenceException" in Selenium?高速緩存中未找到元素 - 可能頁面在查找後發生了變化

public class AdminInterface { 

    @Test(priority=1) 
    public void adminToUserInterface() throws InterruptedException 
    { 
WebDriver driver = new FirefoxDriver(); 

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

     driver.get("http://www.gcrit.com/build3/admin"); 
     driver.findElement(By.xpath("//a[text()='Online Catalog']")).click(); 
     String str = "welcome"; 
     String str1 = (driver.findElement(By.xpath("//div[@id='bodyContent']/div[1]/div[1]")).getText()).toLowerCase(); 
     if(str1.contains(str)) 
      System.out.println("Redirecting to user interface from admin interface successfull == PASS"); 
     else 
      System.out.println("Redirecting to user interface from admin interface failed == FAILED"); 
     Thread.sleep(2000); 
     driver.close(); 
    } 
    @Test(priority=2) 
    public void loginTest() throws InterruptedException 
    { 

     WebDriver driver = new FirefoxDriver(); 

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

     driver.get("http://www.gcrit.com/build3/admin"); 
     driver.findElement(By.name("username")).sendKeys("admin"); 
     driver.findElement(By.name("password")).sendKeys("[email protected]"); 
     driver.findElement(By.id("tdb1")).click(); 

     String str = "Catalog"; 
     String str1=driver.findElement(By.xpath("//div[@id='adminAppMenu']/h3[1]/a")).getText(); 

     if(str.equals(str1)) 
      System.out.println("Login was successful==PASS"); 
     else 
      System.out.println("Login was not successful==FAIL"); 
     Thread.sleep(2000); 
     driver.close(); 

    } 

    @Test(priority=3,dependsOnMethods={"loginTest"}) 
    public void addManufacturer() throws InterruptedException 
    { 

     WebDriver driver = new FirefoxDriver(); 
     driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 

     driver.get("http://www.gcrit.com/build3/admin"); 
     driver.findElement(By.name("username")).sendKeys("admin"); 
     driver.findElement(By.name("password")).sendKeys("[email protected]"); 
     driver.findElement(By.id("tdb1")).click(); 
     driver.findElement(By.xpath("//a[text()='Manufacturers']")).click(); 
     driver.findElement(By.xpath("//span[text()='Insert']")).click(); 
     driver.findElement(By.name("manufacturers_name")).sendKeys("AA1"); 
     driver.findElement(By.id("tdb1")).click(); 
     String str = "AA1"; 
     List<WebElement> tds =driver.findElements(By.tagName("td")); 
     Iterator <WebElement> itr = tds.iterator(); 
     while(itr.hasNext()) 
     { 
      if((itr.next().getText()).equals(str)) 
        { 
        System.out.println("Manufacturer creation was successfull==PASS"); 
        } 

     } 
     Thread.sleep(4000); 
     driver.close(); 



    } 
    @Test(priority=4,dependsOnMethods={"addManufacturer"}) 
    public void editManufacturer() throws InterruptedException 
    { 

     WebDriver driver = new FirefoxDriver(); 
     driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 

     driver.get("http://www.gcrit.com/build3/admin"); 
     driver.findElement(By.name("username")).sendKeys("admin"); 
     driver.findElement(By.name("password")).sendKeys("[email protected]"); 
     driver.findElement(By.id("tdb1")).click(); 
     driver.findElement(By.xpath("//a[text()='Manufacturers']")).click(); 
     String str = "AA1"; 
     List<WebElement> lst = driver.findElements(By.tagName("td")); 
     Iterator<WebElement> itr = lst.iterator(); 
     while(itr.hasNext()) 
     { 
      if((itr.next().getText()).equals(str)) 
        { 
        itr.next().click(); 
        } 
     } 

     new WebDriverWait(driver,20).ignoring(StaleElementReferenceException.class).until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@id='tdb2']/span[2]"))); 
     driver.findElement(By.xpath("//a[@id='tdb2']/span[2]")).click(); 
     driver.findElement(By.name("manufacturers_name")).sendKeys("AA2"); 
     driver.findElement(By.id("tdb1")).click(); 
     String str1="AA2"; 
     List<WebElement> lst1 = driver.findElements(By.tagName("td")); 
     Iterator<WebElement> itr1 = lst1.iterator(); 

     while(itr1.hasNext()) 
     { 
      int i =0; 
      if((itr1.next().getText()).equals(str1)) 
      { 
       System.out.println("The manufacturer "+str+"'s name was successully changed to "+str1+"==PASS"); 
       i++; 
      } 
      if(i==0) 
      { 
       System.out.println("The manufaturer "+str+"'s name could not be changed"); 
      } 
     } 
     Thread.sleep(4000); 
     driver.close(); 
    } 

    @Test(priority=5,dependsOnMethods={"editManufacturer"}) 
    public void deleteManufaturer() throws InterruptedException 
    { 

     WebDriver driver = new FirefoxDriver(); 
     driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 

     driver.get("http://www.gcrit.com/build3/admin"); 
     driver.findElement(By.name("username")).sendKeys("admin"); 
     driver.findElement(By.name("password")).sendKeys("[email protected]"); 
     driver.findElement(By.id("tdb1")).click(); 
     driver.findElement(By.xpath("//a[text()='Manufacturers']")).click(); 
     String str = "AA2"; 
     List<WebElement> lst = driver.findElements(By.tagName("td")); 
     Iterator<WebElement> itr = lst.iterator(); 
     while(itr.hasNext()) 
     { 
      if((itr.next().getText()).equals(str)) 
        { 
        itr.next().click(); 
        } 
     } 

     new WebDriverWait(driver,20).ignoring(StaleElementReferenceException.class).until(ExpectedConditions.elementToBeClickable(By.xpath("//span[text()='Delete']"))); 
     driver.findElement(By.xpath("//span[text()='Delete']")).click(); 



     driver.findElement(By.id("tdb1")).click(); 
     List<WebElement> lst1 = driver.findElements(By.tagName("td")); 
     Iterator<WebElement> itr1= lst1.iterator(); 
     int i=0; 
     while(itr1.hasNext()) 
     { 
      if((itr1.next().getText()).equals(str)) 
      { 
       System.out.println("Deleting the manufaturer "+str+" was unsuccessful == FAIL"); 
       i=1; 
      } 
     } 
     if(i==0) 
     { 
      System.out.println("Deleting the manufacturer "+str+" was successful == PASS"); 
     } 
    } 


} 
+0

你究竟在哪裏得到例外? – Guy

+0

@Guy第4次測試 driver.findElement(By.xpath(「// a [@ id ='tdb2']/span [2]」))。click(); –

+1

請提供[mcve]。沒有人會閱讀那麼多的代碼。 – SiKing

回答

0

傢伙,我發現這個問題的解決方案。 jvm在迭代所有可用元素的單擊操作之後被卡在while循環中。 A'break'語句必須用於在找到該元素時分支出循環。請參考下面的代碼:

原代碼:在@Test 4

while(itr.hasNext()) 
 
     { 
 
      if((itr.next().getText()).equals(str)) 
 
        { 
 
        itr.next().click(); 
 
        } 
 
     }

更新代碼:

while(itr.hasNext()) 
 
     { 
 
      if((itr.next().getText()).equals(str)) 
 
        { 
 
        itr.next().click(); 
 
        break; 
 
        } 
 
     }

同與第五個TestScript一起使用。

1

相反的 -

driver.findElement(By.xpath("//a[@id='tdb2']/span[2]")).click(); 

試試下面代碼 -

element = driver.findElement(By.xpath("//a[@id='tdb2']/span[2]")); 
JavascriptExecutor executor = (JavascriptExecutor)driver; 
executor.executeScript("arguments[0].click();", element); 
+0

謝謝@卡皮爾你的建議對於這個問題非常有用。 我做的錯誤是我忘了在while循環中的Click語句後添加'break'。測試執行被卡在while循環中。 –

相關問題