package com.redhat.qe.auto.sahi; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import net.sf.sahi.client.Browser; import net.sf.sahi.client.ElementStub; import net.sf.sahi.config.Configuration; /** * This class extends the Browser functionality. It * provides logging of UI actions (via java standard logging), * and some convenience methods. * @author dgao * @author jkandasa (Jeeva Kandasamy) */ public class ExtendedSahi extends Browser { private static Logger _logger = Logger.getLogger(ExtendedSahi.class.getName()); public ExtendedSahi(String browserPath, String browserProcessName, String browserOpt, String sahiDir, String userDataDir) { super(browserPath, browserProcessName, browserOpt); Configuration.initJava(sahiDir, userDataDir); } //Core Drop Down selector public void selectDropDownByElementStub(Browser browser, ElementStub dropDownBox, ElementStub optionToSelect){ browser.xy(dropDownBox, 3,3).click(); List<ElementStub> optionToSelectSimilar = optionToSelect.collectSimilar(); optionToSelect = optionToSelectSimilar.get(optionToSelectSimilar.size()-1); _logger.log(Level.INFO, "Selected Option Name: "+optionToSelect.getText()); browser.xy(optionToSelect, 3,3).click(); _logger.log(Level.INFO, "Drop Down Box ["+dropDownBox+"]"); _logger.log(Level.INFO, "Selected the element ["+optionToSelect+"]"); } //This method is used to select drop down on GWT web (Example- RHQ 4.x) public void selectComboBoxDivRow(Browser browser, String comboBoxIdentifier, String optionToSelect){ selectDropDownByElementStub(browser, browser.div(comboBoxIdentifier), browser.row(optionToSelect)); } //This method is used to select drop down, by div, div element public void selectComboBoxDivDiv(Browser browser, String comboBoxIdentifier, String optionToSelect){ selectDropDownByElementStub(browser, browser.div(comboBoxIdentifier), browser.div(optionToSelect)); } //Select drop down with near object by row Option public void selectComboBoxByNearCellOptionByRow(Browser browser, String comboBoxIdentifier, String nearElement, String optionToSelect){ selectComboBoxByNearCell(browser, comboBoxIdentifier, nearElement, browser.row(optionToSelect)); } //Select drop down with near object by div Option public void selectComboBoxByNearCellOptionByDiv(Browser browser, String comboBoxIdentifier, String nearElement, String optionToSelect){ selectComboBoxByNearCell(browser, comboBoxIdentifier, nearElement, browser.div(optionToSelect)); } //Select drop down with near cell object with elementStub option public void selectComboBoxByNearCell(Browser browser, String comboBoxIdentifier, String nearElement, ElementStub optionToSelect){ selectDropDownByElementStub(browser, browser.div(comboBoxIdentifier).near(browser.cell(nearElement)), optionToSelect); } //Getting array value from String public String[] getCommaToArray(String commaValue){ return commaValue.split(","); } //String to key value map public HashMap<String, String> getKeyValueMap(String keyValuesString){ HashMap<String, String> keyValueMap = new HashMap<String, String>(); if(keyValuesString == null){ return keyValueMap; } String[] keyValuesArray = keyValuesString.split(","); for(String keyValue: keyValuesArray){ String[] keyVal = keyValue.split("="); if(keyVal.length < 2 ){ keyValueMap.put(keyVal[0].trim(), ""); }else{ keyValueMap.put(keyVal[0].trim(), keyVal[1].trim()); } } return keyValueMap; } //String to collection of hash map public LinkedList<HashMap<String, String>> getKeyValueMapList(String keyValuesString){ LinkedList<HashMap<String, String>> list = new LinkedList<HashMap<String,String>>(); HashMap<String, String> keyValueMap = new HashMap<String, String>(); String[] keyValuesArray = keyValuesString.split(","); for(String keyValue: keyValuesArray){ String[] keyVal = keyValue.split("="); if(keyVal.length < 2 ){ keyValueMap.put(keyVal[0].trim(), ""); }else{ keyValueMap.put(keyVal[0].trim(), keyVal[1].trim()); } list.addLast((HashMap<String, String>) keyValueMap.clone()); } return list; } //Wait until the element get present or timeout, which one is lesser public boolean waitForElementDivExists(Browser browser, String element, long waitTimeMilliSeconds){ return waitForElementExists(browser, browser.div(element), "Div: "+element, waitTimeMilliSeconds); } public boolean waitForElementRowExists(Browser browser, String element, long waitTimeMilliSeconds){ return waitForElementExists(browser, browser.row(element), "Row: "+element, waitTimeMilliSeconds); } public boolean waitForElementDivVisible(Browser browser, String element, long waitTimeMilliSeconds){ return waitForElementVisible(browser, browser.row(element), "Div: "+element, waitTimeMilliSeconds); } public boolean waitForElementRowVisible(Browser browser, String element, long waitTimeMilliSeconds){ return waitForElementVisible(browser, browser.row(element), "Row: "+element, waitTimeMilliSeconds); } public boolean waitForElementExists(Browser browser, ElementStub elementStub, String element, long maximunWaitTime){ _logger.info("Waiting for the element: ["+element+"], Remaining wait time: "+(maximunWaitTime/1000)+" Second(s)..."); while(maximunWaitTime >= 0){ if(elementStub.exists()){ _logger.info("Element ["+element+"] exists."); return true; }else{ browser.waitFor(500); maximunWaitTime -= 500; if((maximunWaitTime%(1000*5)) <= 0){ _logger.info("Waiting for the element: ["+element+"], Remaining wait time: "+(maximunWaitTime/1000)+" Second(s)..."); } } } _logger.warning("Failed to get the element! ["+element+"]"); return false; } public boolean waitForElementVisible(Browser browser, ElementStub elementStub, String element, long waitTimeMilliSeconds){ _logger.finer("Waiting for the element: ["+element+"], Remaining wait time: "+(waitTimeMilliSeconds/1000)+" Second(s)..."); while(waitTimeMilliSeconds >= 0){ if(elementStub.isVisible()){ _logger.info("Element ["+element+"] is visable"); return true; }else{ browser.waitFor(500); waitTimeMilliSeconds -= 500; if((waitTimeMilliSeconds%(1000*5)) <= 0){ _logger.finer("Waiting for the element: ["+element+"], Remaining wait time: "+(waitTimeMilliSeconds/1000)+" Second(s)..."); } } } _logger.warning("Failed to get the element! ["+element+"]"); return false; } }