From 02e8b95c9c72877d4b4b10fcd3b10765bce01d82 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Fri, 22 Mar 2013 15:55:04 +0800 Subject: [PATCH] IDEMPIERE-92 Implement Selenium testing framework. Added context click support. Improvement to AdempiereIdGenerator for better determination of _zk_locator. Modify LogEventInterceptor to help the writing of fitnesse selenium script. --- .../adempiere/webui/AdempiereIdGenerator.java | 104 ++++++++++-------- .../adempiere/webui/UiLifeCycleListener.java | 6 +- .../adempiere/webui/adwindow/ADTabpanel.java | 5 +- .../webui/util/LogEventInterceptor.java | 5 +- .../src/fitlibrary/zk/ZkFixture.java | 9 ++ 5 files changed, 77 insertions(+), 52 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 c5bdb9fd80..763cb6f643 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 @@ -68,32 +68,41 @@ public class AdempiereIdGenerator implements IdGenerator { if (id == null || id.length() == 0) { locatorBuilder.append("@").append(getWidgetName(comp.getWidgetClass())); - } - - Component parent = comp.getParent(); - while(parent != null) { - //only include id space owner to ease converting test case to use zk id selector instead of uuid - if (parent instanceof IdSpace) { - id = parent.getId(); - if (id != null && id.length() > 0) { - if (id.indexOf(" ") > 0) { - String widgetName = getWidgetName(parent.getWidgetClass()); - locatorBuilder.insert(0, "@"+widgetName+"[id=\'"+id+"\'] "); + Component parent = comp.getParent(); + while(parent != null) { + String parentLocator = parent.getWidgetAttribute(ZK_LOCATOR_ATTRIBUTE); + if (parentLocator != null && parentLocator.trim().length() > 0) { + locatorBuilder.insert(0, parentLocator+ " "); + break; + } + parent = parent.getParent(); + } + } else { + Component parent = comp.getParent(); + while(parent != null) { + //only include id space owner to ease converting test case to use zk id selector instead of uuid + if (parent instanceof IdSpace) { + id = parent.getId(); + if (id != null && id.length() > 0) { + if (id.indexOf(" ") > 0) { + String widgetName = getWidgetName(parent.getWidgetClass()); + locatorBuilder.insert(0, "@"+widgetName+"[id=\'"+id+"\'] "); + } else { + locatorBuilder.insert(0, "$"+id+" "); + } } else { - locatorBuilder.insert(0, "$"+id+" "); - } - } else { - String attribute = parent.getWidgetAttribute(AdempiereWebUI.WIDGET_INSTANCE_NAME); - if (attribute != null && attribute.length() > 0) { - String widgetName = getWidgetName(parent.getWidgetClass()); - id = widgetName+"0"+attribute; - locatorBuilder.insert(0, "@"+widgetName+"["+AdempiereWebUI.WIDGET_INSTANCE_NAME+"=\'"+attribute+"\'] "); - } else { - locatorBuilder.insert(0, "@"+getWidgetName(parent.getWidgetClass())+" "); + String attribute = parent.getWidgetAttribute(AdempiereWebUI.WIDGET_INSTANCE_NAME); + if (attribute != null && attribute.length() > 0) { + String widgetName = getWidgetName(parent.getWidgetClass()); + id = widgetName+"0"+attribute; + locatorBuilder.insert(0, "@"+widgetName+"["+AdempiereWebUI.WIDGET_INSTANCE_NAME+"=\'"+attribute+"\'] "); + } else { + locatorBuilder.insert(0, "@"+getWidgetName(parent.getWidgetClass())+" "); + } } } + parent = parent.getParent(); } - parent = parent.getParent(); } comp.setWidgetAttribute(ZK_LOCATOR_ATTRIBUTE, locatorBuilder.toString()); @@ -154,31 +163,40 @@ public class AdempiereIdGenerator implements IdGenerator { if (id == null || id.length() == 0) { locatorBuilder.append("@").append(getWidgetName(comp.getWidgetClass())); - } - - Component parent = comp.getParent(); - while(parent != null) { - //only include id space owner to ease converting test case to use zk id selector instead of uuid - if (parent instanceof IdSpace) { - id = parent.getId(); - if (id != null && id.length() > 0) { - if (id.indexOf(" ") > 0) { - String widgetName = getWidgetName(parent.getWidgetClass()); - locatorBuilder.insert(0, "@"+widgetName+"[id=\'"+id+"\'] "); + Component parent = comp.getParent(); + while(parent != null) { + String parentLocator = parent.getWidgetAttribute(ZK_LOCATOR_ATTRIBUTE); + if (parentLocator != null && parentLocator.trim().length() > 0) { + locatorBuilder.insert(0, parentLocator+ " "); + break; + } + parent = parent.getParent(); + } + } else { + Component parent = comp.getParent(); + while(parent != null) { + //only include id space owner to ease converting test case to use zk id selector instead of uuid + if (parent instanceof IdSpace) { + id = parent.getId(); + if (id != null && id.length() > 0) { + if (id.indexOf(" ") > 0) { + String widgetName = getWidgetName(parent.getWidgetClass()); + locatorBuilder.insert(0, "@"+widgetName+"[id=\'"+id+"\'] "); + } else { + locatorBuilder.insert(0, "$"+id+" "); + } } else { - locatorBuilder.insert(0, "$"+id+" "); - } - } else { - String attribute = parent.getWidgetAttribute(AdempiereWebUI.WIDGET_INSTANCE_NAME); - if (attribute != null && attribute.length() > 0) { - String widgetName = getWidgetName(parent.getWidgetClass()); - locatorBuilder.insert(0, "@"+widgetName+"["+AdempiereWebUI.WIDGET_INSTANCE_NAME+"=\'"+attribute+"\'] "); - } else { - locatorBuilder.insert(0, "@"+getWidgetName(parent.getWidgetClass())+" "); + String attribute = parent.getWidgetAttribute(AdempiereWebUI.WIDGET_INSTANCE_NAME); + if (attribute != null && attribute.length() > 0) { + String widgetName = getWidgetName(parent.getWidgetClass()); + locatorBuilder.insert(0, "@"+widgetName+"["+AdempiereWebUI.WIDGET_INSTANCE_NAME+"=\'"+attribute+"\'] "); + } else { + locatorBuilder.insert(0, "@"+getWidgetName(parent.getWidgetClass())+" "); + } } } + parent = parent.getParent(); } - parent = parent.getParent(); } comp.setWidgetAttribute(ZK_LOCATOR_ATTRIBUTE, locatorBuilder.toString()); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/UiLifeCycleListener.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/UiLifeCycleListener.java index 3fccc337d3..5940bb7f57 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/UiLifeCycleListener.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/UiLifeCycleListener.java @@ -35,6 +35,7 @@ public class UiLifeCycleListener implements UiLifeCycle { */ @Override public void afterComponentAttached(Component comp, Page page) { + AdempiereIdGenerator.updateZkLocatorAttribute(comp); } /* (non-Javadoc) @@ -49,10 +50,7 @@ public class UiLifeCycleListener implements UiLifeCycle { */ @Override public void afterComponentMoved(Component parent, Component child, Component prevparent) { - String locator = child.getWidgetAttribute(AdempiereIdGenerator.ZK_LOCATOR_ATTRIBUTE); - if (locator != null) { - AdempiereIdGenerator.updateZkLocatorAttribute(child); - } + AdempiereIdGenerator.updateZkLocatorAttribute(child); } /* (non-Javadoc) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java index 1911cba42a..19fd912027 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java @@ -571,6 +571,7 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer if (popupMenu != null) { popupMenu.addMenuListener((ContextMenuListener)editor); + popupMenu.setId(field.getColumnName()+"-popup"); this.appendChild(popupMenu); if (!field.isFieldOnly()) { @@ -585,9 +586,7 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer { popupMenu.addContextElement((XulElement) editor.getComponent()); } - } - - popupMenu.setId(field.getColumnName()+"-popup"); + } } } } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/util/LogEventInterceptor.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/util/LogEventInterceptor.java index 54052a64eb..25e5da9b98 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/util/LogEventInterceptor.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/util/LogEventInterceptor.java @@ -34,8 +34,9 @@ public class LogEventInterceptor implements EventInterceptor { * @see org.zkoss.zk.ui.util.EventInterceptor#beforeProcessEvent(org.zkoss.zk.ui.event.Event) */ @Override - public Event beforeProcessEvent(Event event) { - System.out.println("beforeProcessEvent, event="+event.getName()+",target="+event.getTarget()); + public Event beforeProcessEvent(Event event) { + String locator = event.getTarget() != null ? event.getTarget().getWidgetAttribute("_zk_locator") : ""; + System.out.println("beforeProcessEvent, event="+event.getName()+",target="+event.getTarget()+",locator="+locator); return event; } 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 7b09fd36dc..75eca0792f 100644 --- a/org.idempiere.ui.zk.selenium/src/fitlibrary/zk/ZkFixture.java +++ b/org.idempiere.ui.zk.selenium/src/fitlibrary/zk/ZkFixture.java @@ -9,6 +9,7 @@ import org.idempiere.ui.zk.selenium.Widget; import org.idempiere.ui.zk.selenium.Zk; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; import fitlibrary.annotation.SimpleAction; import fitlibrary.spider.AbstractSpiderFixture; @@ -219,6 +220,14 @@ public class ZkFixture extends SpiderFixture { return widget.eval(webDriver, command); } + @SimpleAction(wiki = "|''context click''|zk locator|", tooltip = "Open context menu") + public void contextClick(String locator) { + Widget widget = new Widget(locator); + WebElement element = widget.findElement(webDriver); + Actions actions = new Actions(webDriver); + actions.contextClick(element).build().perform(); + } + /** * Causes the currently executing thread to sleep for the specified number * of milliseconds, subject to the precision and accuracy of system timers