Friday, December 13, 2024

A simple recorder based on selenium

 As known, selenium automating web applications for testing purposes. Below code will present an idea to record operations performed on the browser using selenium and javascript. The key is using javascript to listen the onlick and onchange event of document element. And then according to the return information to identify what action the tester did and what element the action performed. 


/** JavaScript to register listeners for click & change events. */

private static final String SCRIPT = "var callback = arguments[arguments.length - 1];"

+ "function record(category)"

+ "{"

+"var result = new Array();"

+"result[0] = category;"

+"result[1] = event.srcElement.tagName;"

+"result[2] = event.srcElement.id;"

+"result[3] = event.srcElement.name;"

+"result[4] = event.srcElement.className;"

+"result[5] = event.srcElement.type;"

+"result[6] = event.srcElement.value;"

+"result[7] = event.srcElement.getAttribute('gwt_id');"

+"result[8] = event.srcElement.getAttribute('control_id');"

+"result[9] = event.srcElement.innerText;"

+ "callback(result);"

+ "}"

+ "function click()"

+ "{" 

+ "record('click');"

+ "}"

+ "function enter()"

+ "{" 

+ "record('enter');"

+ "}"

+ "document.onclick = click;"

+ "document.onchange = enter;";


/** Constant definition for tab name index. */

protected static final int TAG_NAME_INDEX = 1;

/** Constant definition for ID index. */

protected static final int ID_INDEX = 2;

/** Constant definition for name index. */

protected static final int NAME_INDEX = 3;

/** Constants definition for class property index. */

protected static final int CLASS_INDEX = 4;

/** Constant definition for value index. */

protected static final int VALUE_INDEX = 6;

/** Constant definition for GWT ID index. */

protected static final int GWT_ID_INDEX = 7;

/** Constant definition for control id index. */

protected static final int CONTROL_ID_INDEX = 8;

/** Constant definition for inner text index. */

protected static final int INNER_TEXT_INDEX = 9;


driver.manage().timeouts().setScriptTimeout(5000, TimeUnit.SECONDS);

Object result = ((JavascriptExecutor) webDriver).executeAsyncScript(SCRIPT);

if (result instanceof List<?>) {

    @SuppressWarnings("unchecked")

    List<String> list = (List<String>) result;

    

    String classAttribute = list.get(CLASS_INDEX);

    ParseResult result = ParseResult.FAILURE;

    if (list[0] == "click" && !StringUtils.isEmpty(classAttribute) && classAttribute.contains("Label")) {

        String tabCaption = list.get(INNER_TEXT_INDEX);

        String xpath = String.format("//div[@class='%s'][text()='%s']/parent::div", list.get(CLASS_INDEX),     tabCaption);

        WebElement element = driver.waitForXPath(xpath);

        String parentClass = element.getAttribute("class");

        if (StringUtils.isNotBlank(parentClass) && parentClass.contains("TabLayoutPanelTabInner")) {

            ICommand command = new Command(COMMAND_NAME, tabCaption);

            result = new ParseResult(command);

        }

    }

}




No comments:

Post a Comment