获取以下代码的陈旧引用异常。我正在使用循环。 :-(

时间:2016-02-24 08:34:31

标签: java selenium selenium-webdriver

我编写了用于比较日期的代码,并根据时间对对象执行取消操作。我想取消UI上显示的所有对象。但我无法取消所有,因为我得到陈旧的引用异常。请帮忙。

List<WebElement> EachbookedAppointment = driver.findElements(By.xpath(prop.getProperty("eachbookedappointment")));

System.out.println(EachbookedAppointment.size());

for(int i=0; i< EachbookedAppointment.size();i++)
{
    WebElement AppointmentStatus =EachbookedAppointment.get(i).findElement(By.xpath(prop.getProperty("AppointmentStatus")));
    System.out.println(AppointmentStatus.getText());
    if(AppointmentStatus.getText().equalsIgnoreCase("Scheduled"))
    {
        String bookingTime = EachbookedAppointment.get(i).findElement(By.xpath("//*[@class ='col-sm-10 time-col appPadding']/span")).getText();
        String year = "2016 ";
        StringBuilder sb = new StringBuilder();
        System.out.println(bookingTime);
        sb.append(year).append(bookingTime);
        String UIDate = sb.toString() ;
        System.out.println(UIDate);
        Date date2 = sdfAmerica.parse(UIDate);

        //String appointmentTime = 
        //sdfAmerica.setTimeZone(TimeZone.getTimeZone("America/New_York"));
        Date onedaybackdate = DateUtils.addHours(date, -24);

        System.out.println(date2 + "It is UI date");
        TimeZone.getTimeZone("IST");

        if(date2.before(Currentdate) && date2.after(onedaybackdate)){
            System.out.println(Currentdate + "comes after " + onedaybackdate);
            //EachbookedAppointment.get(i);//.findElement(By.xpath(prop.getProperty("CancelAppointment")));
            WebElement element = (new WebDriverWait(driver, 20)).until(ExpectedConditions.elementToBeClickable(By.xpath(prop.getProperty("CancelAppointment"))));
            //driver.findElement(By.xpath(prop.getProperty("CancelAppointment"))).click();
            element.click();
            waitUntilSpinnerIsDisplayed();
            Assert.assertEquals(driver.findElement(By.xpath(prop.getProperty("AlertMessage"))).getText(), Constant.Cancelwithin24hourMessage);
        }
        else if(date2.after(Currentdate) || date2.before(onedaybackdate))
        {
            System.out.println(date2 + " UI displayed date ");
            EachbookedAppointment.get(i).findElement(By.xpath(prop.getProperty("CancelAppointment"))).click();
            //WebElement element = (new WebDriverWait(driver, 20)).until(ExpectedConditions.elementToBeClickable(By.xpath(prop.getProperty("CancelAppointment"))));
            //driver.findElement(By.xpath(prop.getProperty("CancelAppointment"))).click();
            WebElement CancelYes = (new WebDriverWait(driver, 20)).until(ExpectedConditions.elementToBeClickable(By.xpath(prop.getProperty("CancelYes"))));
            CancelYes.click();
            waitUntilSpinnerIsDisplayed();

            WebElement Alert = (new WebDriverWait(driver, 20)).until(ExpectedConditions.elementToBeClickable(By.xpath(prop.getProperty("AlertMessage"))));
            System.out.println(Alert.getText());
            //Assert.assertEquals(driver.findElement(By.xpath(prop.getProperty("AlertMessage"))).getText(), Constant.CancelAlertMessage);
            waitUntilSpinnerIsDisplayed();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

如果您在selenium中识别任何元素并在以后修改它,则会出现此错误。

在您的情况下,List包含所有元素(EachbookedAppointment),稍后您提到您正在选择取消,我假设此项目被修改或删除。这打破了我们之前找到的列表的完整性,因此您将获得此异常。

<强>提示:

  1. 获取List的大小后,将大小存储在单独的变量中,并用它来控制 for 循环。
  2. 根本不在循环中使用此列表,我们只需要循环的大小。
  3. 在循环内部,第一个语句将是再次识别所有对象的列表(EachbookedAppointment),现在使用此列表而不是循环中的其他位置。
  4. 参考您的代码,我可以推断您每次都尝试取消第一个有效元素,因此,使用get(i)更改所有get(0)。因此,您将每次操作列表的第一个元素,这反过来每次都会更改,因为我们在循环中取消它。
  5. 如果它不起作用,请尝试基于此代码构建自己的代码,在取消对象时共享应用程序的行为(无论是更改还是删除或任何其他属性更改)。获得这些详细信息后,我们将能够帮助您进一步完善代码。

    只有您需要记住的是,如果您的WebElement被修改,您将收到此错误。