How to find a file using a variable for 'Start

2019-02-28 08:38发布

问题:

I'm trying to find a file based on the first 8 numbers i pull from an excel sheet for each iteration. Whenever I use the code below I get the error message "Local variable CaseID defined in an enclosing scope must be final or effectively final". I'm still new so i'm not sure how to fix this even though it sounds like a simple fix. The issue is happening at the caseID variable towards the bottom of the code.

  package Chrome;
    //CHROME
    import java.io.File;
    import java.io.FileFilter;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.FilenameFilter;

    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.DataFormatter;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.chrome.ChromeOptions;


    public class ValidateInput {

    public static void main(String[] args) throws Throwable {
    // TODO Auto-generated method stub

    // String filePath=System.getProperty("user.dir")+"\\UP.xlsx";
    //File src = new File(filePath);    
    //System.out.println(filePath);
    File src = new File("C:\\Users\\Z246379\\Documents\\TestDataFolder\\ValidateInput.xlsx");          
    FileInputStream fis = new FileInputStream(src);        



    XSSFWorkbook wb = new XSSFWorkbook(fis);        
    XSSFSheet Sheet1 = wb.getSheetAt(0);
    int i1 = 2;
    //Username
    String data0 = Sheet1.getRow(2).getCell(0).getStringCellValue();
    //Password    
    String data01 = Sheet1.getRow(2).getCell(1).getStringCellValue();
    //Case ID
    String caseID = Sheet1.getRow(i1).getCell(2).getStringCellValue();
    // Description
   String Desc = Sheet1.getRow(2).getCell(3).getStringCellValue();
   //Internal Claim File
   String ICF = Sheet1.getRow(1).getCell(4).getStringCellValue();
    String CRPT = Sheet1.getRow(1).getCell(5).getStringCellValue();

    // final String caseID1 = caseID1;




    //Chrome driver code

     System.out.println("Called openBrowser");
     String exePath = System.getProperty("user.dir")+"\\chromedriver.exe";
     System.setProperty("webdriver.chrome.driver", exePath);
     ChromeOptions options = new ChromeOptions();
     options.setExperimentalOption("useAutomationExtension", false);
     options.addArguments("start-maximized");
     options.addArguments("--no-sandbox");
     options.addArguments("--disable-extensions-except");
     options.addArguments("disable-extensions");
     //options.setExperimentalOption("useAutomationExtension", false); 
     WebDriver driver = new ChromeDriver(options);
     driver.get("https://client.abc.com");


     //Logging in       
     driver.findElement(By.xpath("//input[@id='userid']")).sendKeys(data0);
     driver.findElement(By.xpath("//body[@class='no-nav']/div[@id='wrapper']/header[@class='header']/div[@class='container']/div[@class='menu']/div[@class='drop']/div[@class='login-form']/form[@method='POST']/div[2]/input[1]")).sendKeys(data01);
     driver.findElement(By.xpath("//input[@value='Sign In']")).click();
     Thread.sleep(2000);
     //Navigate to Validate Input
     driver.findElement(By.xpath("//span[@class='wpsNavLevel2'][contains(text(),'EZ-Test')]")).click();
     Thread.sleep(3000);
     driver.get("https://ezt.abc.com/Test/inputFiles/selectValidateInput/selectValidateInput.xhtml");

     while (caseID != null)
          {

      caseID = Sheet1.getRow(i1).getCell(2).getStringCellValue();
      //Input Validate Input stuff

      driver.findElement(By.xpath("//input[@id='mainForm:caseId']")).sendKeys(caseID);
    driver.findElement(By.xpath("//input[@id='mainForm:testBedDesc']")).sendKeys(Desc);
      driver.findElement(By.xpath("//select[@id='mainForm:customRptOptions']")).sendKeys(ICF);
     driver.findElement(By.xpath("//span[@id='mainForm:customReportLabel']")).click();




      File dir = new File("C:\\Users\\Z333379\\Documents\\Test beds");
      FilenameFilter filter = new FilenameFilter() {
      public boolean accept (File dir, String name) { 
       return name.startsWith(caseID); //this is where i get the error. its not letting me make case ID a variable. but i really need the starts with stuff
       } 
     }; 
     String[] children = dir.list(filter);
     if (children == null) {
        System.out.println("Either dir does not exist or is not a directory"); 
     } else { 
       for (int i=0; i< children.length; i++) {
       String filename = children[i];
       System.out.println(filename);
            driver.findElement(By.xpath("//input[@id='mainForm:comprehensive']")).sendKeys("C:\\Users\\Z246379\\Documents\\Test beds\\" + filename);
        } 
     } 

     driver.findElement(By.xpath("//button[@id='mainForm:reset']")).click();


     i1=i1+1;
          }

      }
    }

回答1:

Here:

FilenameFilter filter = new FilenameFilter() {
    public boolean accept (File dir, String name) { 
        return name.startsWith(caseID);
    } 
};

You cannot use a mutable variable in the definition of an inner local class. That's why you receive the error compiler.

Create a temporary variable and assign the value of caseID there, use this variable in your inner local class:

final String localCaseID = caseID;
FilenameFilter filter = new FilenameFilter() {
    public boolean accept (File dir, String name) { 
        return name.startsWith(localCaseID);
    } 
};


回答2:

You can use inner class instead of anonymous one. Define it like:

   private static class CaseIDFilenameFilter implements FilenameFilter {
       private final String caseID;

       private CaseIDFilenameFilter(String caseID) {
           this.caseID = caseID;
       }

       @Override
       public boolean accept(File dir, String name) {
           return name.startsWith(caseID);
       }
}

And then use it in your code like:

FilenameFilter filter = new CaseIDFilenameFilter(str);