2014-11-06 2 views
-1

Я новичок в Selenium, есть два отдельных файла файла .xls для GmailTestSuite.xls и других для objectrepository.xls.Почему webdriver постоянно открывается для каждой операции?

Я создал MainClass, в этом я написал код, который читал как файл .xls, так и я открыл в нем драйвер и выполнял операцию. Но проблема в том, что он постоянно открывает новый драйвер, но не выполняет никаких операций.

Пожалуйста, сообщите и сообщите, где я пойду не так.

public class MainClass { 

    static Properties properties= null; 

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

     ReadPropertyFile readConfigFile= new ReadPropertyFile(); 
     properties= readConfigFile.loadPropertiess(); 

     ExcelHandler testSuite= new ExcelHandler("D:\\GmailTestSuite.xls", "Suite"); 
     testSuite.columnData(); 

     int rowCount= testSuite.rowCount(); 
     System.out.println("Total Rows="+rowCount); 

     for(int i=1;i<rowCount;i++) 
     { 
      String executable= testSuite.readCell(testSuite.getCell("Executable"), i); 
      System.out.println("Executable="+executable); 

      if(executable.equalsIgnoreCase("y")){ 
      // exe. the process 
       String scenarioName= testSuite.readCell(testSuite.getCell("TestScenario"), i); 
       System.out.println("Scenario Name="+scenarioName); 
       ExcelHandler testScenarios= new ExcelHandler("D:\\GmailTestSuite.xls", scenarioName); 

       int rowWorkBook1= testScenarios.rowCount(); 
       for(int j=1; j<rowWorkBook1;j++){ 
        String framWork= testScenarios.readCell(testScenarios.getCell("FrameworkName"), j); 
        String operation = testScenarios.readCell(testScenarios.getCell("Operation"), j); //SendKey 
        String value= testScenarios.readCell(testScenarios.getCell("Value"), j); 
        System.out.println("FRMName="+framWork+",Operation="+operation+",Value="+value); 

        ExcelHandler objectRepository= new ExcelHandler("D:\\objectrepository.xls", "OR"); 
        objectRepository.columnData(); 
        int rowCount1= testSuite.rowCount(); 
        System.out.println("Total Rows="+rowCount1); 

        for(int k=1;k<rowCount;k++){ 
         String frameWorkName= objectRepository.readCell(objectRepository.getCell("Executable"), k); 
         String ObjectName= objectRepository.readCell(testScenarios.getCell("ObjectName"), k); 
         String Locator = objectRepository.readCell(testScenarios.getCell("Locator"), k); //SendKey 

         System.out.println("FrameWorkName="+frameWorkName+",ObjectName="+ObjectName+",Locator="+Locator); 

         //ExcelHandler executeOperation = new ExcelHandler(ObjectName, operation, value); 
         File file= new File("D:\\softs\\FF installed\\FF18\\firefox.exe"); 
         FirefoxBinary fb = new FirefoxBinary(file); 
         WebDriver driver = new FirefoxDriver(fb,new FirefoxProfile()); 
         driver.get("https://www.gmail.com"); 
         WebElement we = driver.findElement(By.id("Email")); 

         if(operation.equalsIgnoreCase("SendKey")) 
         { 
          we.sendKeys("[email protected]"); 
          we.sendKeys("[email protected]"); 
         } 

         if(operation.equalsIgnoreCase("Click")) 
          we.click(); 
        } 
       } 
      } 
     } 
    } 
+0

Нет времени, чтобы написать правильный ответ, но очевидным является то, что вы создаете экземпляр «WebDriver» внутри цикла, поэтому вы в конечном итоге открываете газильон. Если вы создадите его только один раз за пределами циклов, а затем вызовите его в цикле, вероятно, это будет то, что вы ищете в этом случае. – t0mppa

+0

@ t0mppa Можете ли вы привести мне пример этого, я знаю его глупый вопрос, но если вы дадите, тогда это будет полезно для меня :) – user2092132

ответ

0

Пара направляющих линий для лучшего Сформированный код:

  • Перерыв код в методы, которые только делают одну вещь каждый. Таким образом, проще управлять и красиво разделять, а также вы не входите в аденирующий ад с таким встроенным циклом, а если структура такая, как у вас здесь.
  • Используйте переменные класса для таких вещей, как экземпляр WebDriver, так что вы можете его инициализировать один раз и продолжать называть его позже.
  • Не вставляйте текст в приложение, используйте константы. Затем вам нужно только один раз определить текст и обратиться к нему несколько раз. Делает код намного проще в обслуживании и изменении, когда вам не нужно искать и заменять весь класс после изменения некоторых деталей (например, пути к файлу).

Кроме того, я предполагаю, что вы имели в виду, чтобы сделать следующее:

  1. петля строки в objectRepository в к-петле, вместо зацикливания строки в testSuite снова.
  2. получить клетки от objectRepository, а не из testScenarios при чтении клеток из objectRepository

Пример:

public class MainClass { 
    private static final String BROWSER_PATH = "D:\\softs\\FF installed\\FF18\\firefox.exe"; 
    private static final String TEST_SUITE_PATH = "D:\\GmailTestSuite.xls"; 
    private static final String OBJECT_REPOSITORY_PATH = "D:\\objectrepository.xls"; 
    private static final String ADDRESS_TO_TEST = "https://www.gmail.com"; 

    private static final By EMAIL_INPUT = By.id("Email"); 
    // other constants 

    private WebDriver driver; 
    private Properties properties; 

    public MainClass() { 
     File file = new File(BROWSER_PATH); 
     FirefoxBinary fb = new FirefoxBinary(file); 
     driver = new FirefoxDriver(fb, new FirefoxProfile()); 
     driver.get(ADDRESS_TO_TEST); 
    } 

    public static void main(String[] args) throws IOException, BiffException { 
     MainClass main = new MainClass(); 

     main.handleTestSuite(); 
    } 

    private void handleTestSuite() { 
     ReadPropertyFile readConfigFile = new ReadPropertyFile(); 
     properties = readConfigFile.loadPropertiess(); 

     ExcelHandler testSuite = new ExcelHandler(TEST_SUITE_PATH, "Suite"); 
     testSuite.columnData(); 

     int rowCount = testSuite.rowCount(); 
     System.out.println("Total Rows=" + rowCount); 

     for (int i = 1; i < rowCount; i++) { 
      String executable = testSuite.readCell(testSuite.getCell("Executable"), i); 
      System.out.println("Executable=" + executable); 

      if (executable.equalsIgnoreCase("y")) { 
       // exe. the process 
       String scenarioName = testSuite.readCell(testSuite.getCell("TestScenario"), i); 
       System.out.println("Scenario Name=" + scenarioName); 
       handleScenario(scenarioName); 
      } 
     } 
    } 

    private void handleScenario(String scenarioName) { 
     ExcelHandler testScenarios = new ExcelHandler(TEST_SUITE_PATH, scenarioName); 

     int rowWorkBook1 = testScenarios.rowCount(); 
     for (int j = 1; j < rowWorkBook1; j++) { 
      String framWork = testScenarios.readCell(testScenarios.getCell("FrameworkName"), j); 
      String operation = testScenarios.readCell(testScenarios.getCell("Operation"), j); // SendKey 
      String value = testScenarios.readCell(testScenarios.getCell("Value"), j); 
      System.out.println("FRMName=" + framWork + ",Operation=" + operation + 
           ",Value=" + value); 

      handleObjects(operation); 
     } 
    } 

    private void handleObjects(String operation) { 
     ExcelHandler objectRepository = new ExcelHandler(OBJECT_REPOSITORY_PATH, "OR"); 
     objectRepository.columnData(); 
     int rowCount = objectRepository.rowCount(); 
     System.out.println("Total Rows=" + rowCount); 

     for (int k = 1; k < rowCount; k++) { 
      String frameWorkName = objectRepository.readCell(objectRepository.getCell("Executable"), k); 
      String ObjectName = objectRepository.readCell(objectRepository.getCell("ObjectName"), k); 
      String Locator = objectRepository.readCell(objectRepository.getCell("Locator"), k); // SendKey 

      System.out.println("FrameWorkName=" + frameWorkName + 
           ",ObjectName=" + ObjectName + ",Locator=" + Locator); 

      operateWebDriver(operation); 
     } 
    } 

    private void operateWebDriver(String operation) { 
     WebElement we = driver.findElement(EMAIL_INPUT); 

     if (operation.equalsIgnoreCase("SendKey")) { 
      we.sendKeys("[email protected]"); 
      we.sendKeys("[email protected]"); 
     } else if (operation.equalsIgnoreCase("Click")) { 
      we.click(); 
     } 
    } 
} 

Если ExcelHandler является вашей собственной реализации, вы действительно должны переместить getCell(String s) метод внутри метода readCell() для изменения шаблона вызова от handler.readCell(handler.getCell("foo"), i) до handler.readCell("foo", i).Если это библиотека вы используете, вы всегда можете сделать вспомогательный метод:

private static String readCell(ExcelHandler handler, String cellName, int row) { 
    return handler.readCell(handler.getCell(cellName), row); 
} 

EDIT

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

Измененный выше код немного (просто комментировал вызов с другими методами, и опустить их из фрагмента, переместили линию открытия нужной страницы в конструктор и переписал operateWebDriver() метод чуть позже):

public class MainClass { 
    private static final String ADDRESS_TO_TEST = "https://www.gmail.com"; 

    private static final By EMAIL_INPUT = By.id("Email"); 
    private static final By PASSWORD_INPUT = By.id("Passwd"); 
    private static final By SIGN_IN_BUTTON = By.id("signIn"); 

    private static final String EMAIL = "[email protected]"; 
    private static final String PASSWORD = "test123"; 

    private WebDriver driver; 

    public MainClass() { 
     File file = new File(BROWSER_PATH); 
     FirefoxBinary fb = new FirefoxBinary(file); 
     driver = new FirefoxDriver(fb, new FirefoxProfile()); 
     driver.get(ADDRESS_TO_TEST); 
    } 

    public static void main(String[] args) throws IOException, BiffException { 
     MainClass main = new MainClass(); 

     //main.handleTestSuite(); 

     main.operateWebDriver("Click", EMAIL_INPUT); 
     main.operateWebDriver("SendKey", EMAIL_INPUT, EMAIL); 
     main.operateWebDriver("Click", PASSWORD_INPUT); 
     main.operateWebDriver("SendKey", PASSWORD_INPUT, PASSWORD); 
     main.operateWebDriver("Click", SIGN_IN_BUTTON); 
    } 

    private void operateWebDriver(String operation, By element) { 
     operateWebDriver(operation, element, null); 
    } 

    private void operateWebDriver(String operation, By element, String keys) { 
     WebElement we = driver.findElement(element); 

     if (operation.equalsIgnoreCase("SendKey")) { 
      we.sendKeys(keys); 
     } else if (operation.equalsIgnoreCase("Click")) { 
      we.click(); 
     } 
    } 
} 

Затем, как только вы получите WebDriver, вы можете начать считывать данные из файлов и использовать его для работы WebDriver.

+0

Спасибо за ваш ответ, его помощь для меня, но я хочу знать, что с этим почему его не отправляют или не задают ключ в текстовом поле? – user2092132

+0

@ user2092132: Отредактированный ответ с подробностями о том, как изменить код, чтобы сосредоточиться на том, чтобы заставить WebDriver работать так, как вы этого хотите. – t0mppa

+0

На самом деле я хочу прочитать весь ключ из файла .xls, то, что вы указали в коде «Edited», я уже пробовал. В предыдущем коде печатаются все данные webElements, которые приведены в методе «operationWebDriver». Проблема находится в цикле, где мы отправляем ключи в if() loop. Пожалуйста, проверьте и предложите. – user2092132

-1

@ user2092132- Вам потребуется внести изменения на двух местах в коде

1: Вставить новую строку после линейчатым System.out.println ("Всего Ряды =" + ROWCOUNT); Драйвер WebDriver = null;

2: Изменить строку: WebDriver driver = новый FirefoxDriver (fb, новый FirefoxProfile()); To: driver = new FirefoxDriver (fb, новый FirefoxProfile());

Вышеуказанные изменения должны разрешать инициирование нового instacne FF каждый раз.

Смежные вопросы