Исключение устаревших элементов по-прежнему сохраняется, несмотря на 20 попыток

Я видел один пост перед тем, как исключить устаревший элемент, и использовал код повтора для его обработки. Но, несмотря на то, что счет составляет 20, исключение устаревших элементов все еще сохраняется. Я вижу, что element2 загружается на тестируемой веб-странице. Но его все еще идентифицируется как устаревший элемент. Код работает в случае element1 иногда. но никогда для кода element2:

for (i = 1; i < 7; i++)
        {   
            sServiceID = ExcelUtils.getCellData(i,Constant.Col_ServiceID);
            System.out.println("sServiceID:"+sServiceID);   

            ServiceID_Filter().clear();//function returns element
            ServiceID_Filter().sendKeys(sServiceID);
            BaseClass.driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);

            Thread.sleep(3000);
            ApplyFilters_element().click();
            Thread.sleep(3000);


      boolean result = false;
                        int attempts = 0;
                        while(attempts < 20) {
                            System.out.println("inside stale check loop");
                            BaseClass.driver.manage().timeouts().implicitlyWait(20,TimeUnit.SECONDS);
                            try {
                                if(element1.isDisplayed()||element2.isDisplayed())  //either one of the elements will be loaded
                                {
                                System.out.println("not stale "+Table_widget.ExportButton().isDisplayed());
                                result = true;
                                break;
                                }
                            } catch(StaleElementReferenceException e) {
                                System.out.println("stale at attempt "+attempts);
                            }
                            attempts++;
                        }
    if(result==true)
                  {
                      if(element1.isDisplayed())
                      {
                          element3.click();  
                          System.out.println(" button clicked");
                          Thread.sleep(1000);
                      }
                      else
                          if(element2.isDisplayed())
                          {  element3.click();  
                             System.out.println("No records found"); 
                             Thread.sleep(1000);
                          }
                  }
        }

1 ответ

Решение

По моему скромному мнению, проблема здесь:

 BaseClass.driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);

            Thread.sleep(3000);
            ApplyFilters_element().click();
            Thread.sleep(3000);

Прежде всего, вы используете неявное ожидание плюс спящий поток, что является причиной катастрофы. Это то, что вызывает ваши исключения устаревших элементов, попробуйте что-то вроде этого ниже:

public boolean waitForElement(String elementXpath, int timeOut) {

    try{                    
    WebDriverWait wait = new WebDriverWait(driver, timeOut); 
    boolean elementPresent=wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(elementXpath)).isDisplayed());

    System.out.printf("%nElement is present [T/F]..? ")+elementPresent;
    }        
    catch(TimeoutException e1){e1.printStackTrace();elementPresent=false;}          

    return elementPresent;   
 }

Удачи!

Другие вопросы по тегам