为什么webdriver会为每个操作持续打开?

时间:2014-11-06 03:15:52

标签: java excel selenium selenium-webdriver

我是Selenium的初学者,有两个单独的.xls文件文件,一个用于GmailTestSuite.xls,另一个用于objectrepository.xls。

我创建了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("abc@gmail.com");
                            we.sendKeys("si@2013");
                        }   

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

2 个答案:

答案 0 :(得分:0)

为更好的代码编写了几条指南:

  • 将代码分解为只执行一项操作的方法。这样,它更容易管理,并且很好地划分区域,而且你不会使用这样的嵌入式循环进入缩进地狱,如果结构是你在这里的结构。
  • 将类变量用于WebDriver实例之类的内容,这样您就可以初始化一次,并在以后继续调用它。
  • 不要将文本硬编码到应用程序中,使用常量。然后,您只需要定义一次文本,并可以多次引用它。在一些细节(如文件路径)发生变化之后,当您不必通过整个类进行搜索和替换时,可以使代码更易于维护和更改。

另外,我猜你打算做以下事情:

  1. 循环k循环中objectRepository中的行,而不是再次循环testSuite中的行。
  2. objectRepository
  3. 读取单元格时,从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("abc@gmail.com");
                we.sendKeys("si@2013");
            } 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);
    }
    

    修改

    由于您在让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 = "test@abc.com";
        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

答案 1 :(得分:-1)

@ user2092132-您需要在代码中的两个位置进行更改

1:在-System.out.println(“Total Rows =”+ rowCount)之后插入新行; WebDriver driver = null;

2:更改以下行:WebDriver driver = new FirefoxDriver(fb,new FirefoxProfile()); To:driver = new FirefoxDriver(fb,new FirefoxProfile());

以上两项更改应解决每次启动FF的新instacne。