From ac0d909eace24e4e926a7a3d1768c9fbda68a8a6 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Thu, 14 Feb 2013 21:03:53 +0800 Subject: [PATCH] IDEMPIERE-92 Implement Selenium testing framework. Fixed _zk_locator for id with space. Added execution of arbitrary zk widget command support to zk fixture. --- .../adempiere/webui/AdempiereIdGenerator.java | 32 ++++++++++++++++--- .../src/fitlibrary/zk/ZkFixture.java | 26 ++++++++++++--- .../org/idempiere/ui/zk/selenium/Widget.java | 2 ++ 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereIdGenerator.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereIdGenerator.java index 90425dbb60..13fde649e4 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereIdGenerator.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereIdGenerator.java @@ -58,7 +58,14 @@ public class AdempiereIdGenerator implements IdGenerator { .append("=\'").append(attribute).append("']"); } } else { - locatorBuilder.append("$").append(prefix); + if (prefix.indexOf(" ") > 0) { + String widgetName = getWidgetName(comp.getWidgetClass()); + locatorBuilder.append("@") + .append(widgetName).append("[id") + .append("=\'").append(prefix).append("']"); + } else { + locatorBuilder.append("$").append(prefix); + } } if (prefix == null || prefix.length() == 0) { @@ -74,7 +81,12 @@ public class AdempiereIdGenerator implements IdGenerator { String id = parent.getId(); if (id != null && id.length() > 0) { builder.insert(0, id+"_"); - locatorBuilder.insert(0, "$"+id+" "); + if (id.indexOf(" ") > 0) { + String widgetName = getWidgetName(parent.getWidgetClass()); + locatorBuilder.insert(0, "@"+widgetName+"[id=\'"+id+"\'] "); + } else { + locatorBuilder.insert(0, "$"+id+" "); + } } else { String attribute = parent.getWidgetAttribute(AdempiereWebUI.WIDGET_INSTANCE_NAME); if (attribute != null && attribute.length() > 0) { @@ -162,7 +174,14 @@ public class AdempiereIdGenerator implements IdGenerator { .append("=\'").append(attribute).append("']"); } } else { - locatorBuilder.append("$").append(prefix); + if (prefix.indexOf(" ") > 0) { + String widgetName = getWidgetName(comp.getWidgetClass()); + locatorBuilder.append("@") + .append(widgetName).append("[id") + .append("=\'").append(prefix).append("']"); + } else { + locatorBuilder.append("$").append(prefix); + } } if (prefix == null || prefix.length() == 0) { @@ -175,7 +194,12 @@ public class AdempiereIdGenerator implements IdGenerator { if (parent instanceof IdSpace) { String id = parent.getId(); if (id != null && id.length() > 0) { - locatorBuilder.insert(0, "$"+id+" "); + if (id.indexOf(" ") > 0) { + String widgetName = getWidgetName(parent.getWidgetClass()); + locatorBuilder.insert(0, "@"+widgetName+"[id=\'"+id+"\'] "); + } else { + locatorBuilder.insert(0, "$"+id+" "); + } } else { String attribute = parent.getWidgetAttribute(AdempiereWebUI.WIDGET_INSTANCE_NAME); if (attribute != null && attribute.length() > 0) { diff --git a/org.idempiere.ui.zk.selenium/src/fitlibrary/zk/ZkFixture.java b/org.idempiere.ui.zk.selenium/src/fitlibrary/zk/ZkFixture.java index 45186d604b..7b09fd36dc 100644 --- a/org.idempiere.ui.zk.selenium/src/fitlibrary/zk/ZkFixture.java +++ b/org.idempiere.ui.zk.selenium/src/fitlibrary/zk/ZkFixture.java @@ -47,6 +47,7 @@ public class ZkFixture extends SpiderFixture { } // --------- ComboBox --------- + @SimpleAction(wiki = "|''combobox''|zk locator|''selected value''|", tooltip = "Return current selected value") public String comboboxSelectedValue(String locator) { Widget widget = new Widget(locator); return (String) widget.eval(webDriver, "getValue()"); @@ -88,6 +89,7 @@ public class ZkFixture extends SpiderFixture { return false; } + @SimpleAction(wiki= "|''combobox''|zk locator|''set text''|text|", tooltip = "Enter text into combobox and fire onChange event") public boolean comboboxSetText(String locator, String text) { Widget widget = new Widget(locator); widget.execute(webDriver, "setValue('"+text+"', true)"); @@ -199,13 +201,22 @@ public class ZkFixture extends SpiderFixture { } } + @SimpleAction(wiki="|''focus''|xpath, id or other locator|", tooltip= "Set focus to a zk widget") public void focus(String locator) { Widget widget = new Widget(locator); - widget.execute(webDriver, "focus()"); + widget.execute(webDriver, "focus_(100)"); } - protected String getEval(String script) { - return String.valueOf(executeJavaScript("return ("+ script+");")); + @SimpleAction(wiki = "|''with widget''|zk locator|''execute''|command|", tooltip = "Execute zk widget command") + public void withWidgetExecute(String locator, String command) { + Widget widget = new Widget(locator); + widget.execute(webDriver, command); + } + + @SimpleAction(wiki = "|''with widget''|zk locator|''eval''|command|", tooltip = "Execute zk widget command and return the result") + public Object withWidgetEval(String locator, String command) { + Widget widget = new Widget(locator); + return widget.eval(webDriver, command); } /** @@ -214,13 +225,20 @@ public class ZkFixture extends SpiderFixture { * and schedulers. The thread does not lose ownership of any monitors. * @param millis the length of time to sleep in milliseconds. */ - protected void sleep(long millis) { + @SimpleAction(wiki = "|''sleep''|millisecond|", tooltip = "sleep") + public void sleep(long millis) { try { Thread.sleep(millis); } catch (InterruptedException e) { } } + protected String getEval(String script) { + return String.valueOf(executeJavaScript("return ("+ script+");")); + } + + + class ZkFinder implements Finder { @Override diff --git a/org.idempiere.ui.zk.selenium/src/org/idempiere/ui/zk/selenium/Widget.java b/org.idempiere.ui.zk.selenium/src/org/idempiere/ui/zk/selenium/Widget.java index f617b9f221..c11f224e62 100644 --- a/org.idempiere.ui.zk.selenium/src/org/idempiere/ui/zk/selenium/Widget.java +++ b/org.idempiere.ui.zk.selenium/src/org/idempiere/ui/zk/selenium/Widget.java @@ -53,6 +53,7 @@ public class Widget extends By { public void execute(WebDriver driver, String command) { JavascriptExecutor executor = (JavascriptExecutor) driver; StringBuilder builder = getWidgetLocatorScript(locator); + command = command.replace("'", "\\'"); builder.append(".").append(command).append(";"); executor.executeScript(builder.toString()); } @@ -60,6 +61,7 @@ public class Widget extends By { public Object eval(WebDriver driver, String command) { JavascriptExecutor executor = (JavascriptExecutor) driver; StringBuilder builder = getWidgetLocatorScript(locator); + command = command.replace("'", "\\'"); builder.insert(0, "return "); builder.append(".").append(command).append(";"); return executor.executeScript(builder.toString());