/*
 * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

import com.thoughtworks.selenium.*;
import java.util.regex.Pattern;
import org.testng.annotations.*;
import org.testng.Assert;
import org.openqa.selenium.server.SeleniumServer;

public class SeleniumTest {
    
    private DefaultSelenium selenium;
    
    //@Parameters({"selen-svr-addr","brwsr-path","aut-addr"})
    @BeforeClass
    private void init() throws Exception {
        System.out.println("Starting Selenium Launcher--->");
        selenium = new DefaultSelenium("localhost",
                SeleniumServer.getDefaultPort(), "*iexplore", "http://localhost:4848");
        
        
        
    /* selenium = new DefaultSelenium(selenSrvrAddr,
             SeleniumServer.getDefaultPort(), bpath, appPath);*/
        
        
     /*selClient = new DefaultSelenium("localhost", 4444,
            "*firefox", "http://localhost:" + PORT);*/
        
        selenium.start();
    }
    
    @Test
    public void test1(){
        Assert.assertTrue(true,"Pass");
    }
    
    @Test
    @Parameters({"aut-addr"})
    public void testLoginScreen() throws Exception {
        try{
        System.out.println("Running testSelenium--->");
        selenium.open("http://localhost:4848");
        selenium.open("/");
        /*selenium.type("sf", "glassfish");
        selenium.click("btnG");
        selenium.waitForPageToLoad("30000");
        selenium.click("//a/b[2]");*/
        selenium.waitForPageToLoad("30000");
        //verifyTrue(selenium.isTextPresent("JRuby"));
        //verifyEquals("glassfish: GlassFish Community", selenium.getTitle());
        
        
        //Assert.assertEquals("", selenium.getText("//img[@alt='GlassFish V2']"));
        
        selenium.open("/login.jsf");
        selenium.waitForPageToLoad("30000");
        //selenium.type("Login.username", "admin");
        selenium.type("j_username", "admin");        
        //selenium.waitForPageToLoad("30000");
        //selenium.type("Login.password", "adminadmin");
        selenium.type("j_password", "adminadmin");
        //selenium.waitForPageToLoad("3000");
        selenium.click("loginButton");
        //selenium.waitForPageToLoad("30000");
        }catch(Exception e){
            e.printStackTrace();
            throw new Exception(e);
        }
        
        
    }
    
    @AfterClass
    private void stop() throws Exception {
        selenium.stop();
    }    
    
    
}
