diff --git a/galen-core/src/main/java/net/mindengine/galen/speclang2/reader/pagespec/ObjectDefinitionProcessor.java b/galen-core/src/main/java/net/mindengine/galen/speclang2/reader/pagespec/ObjectDefinitionProcessor.java index 26eb5e34..2ffeb2e6 100644 --- a/galen-core/src/main/java/net/mindengine/galen/speclang2/reader/pagespec/ObjectDefinitionProcessor.java +++ b/galen-core/src/main/java/net/mindengine/galen/speclang2/reader/pagespec/ObjectDefinitionProcessor.java @@ -15,6 +15,7 @@ ******************************************************************************/ package net.mindengine.galen.speclang2.reader.pagespec; +import net.mindengine.galen.page.Page; import net.mindengine.galen.parser.ExpectWord; import net.mindengine.galen.parser.Expectations; import net.mindengine.galen.parser.StructNode; @@ -66,8 +67,25 @@ private void parseObject(StructNode childNode) { Locator locator = readLocatorFromString(childNode, objectName, locatorText.trim()); locator.setCorrections(corrections); - pageSpecProcessor.addObjectToSpec(objectName, locator); + addObjectsToSpec(objectName, locator); + } + + private void addObjectsToSpec(String objectName, Locator locator) { + if (objectName.contains("*")) { + addMultiObjectsToSpec(objectName, locator); + } else { + pageSpecProcessor.addObjectToSpec(objectName, locator); + } + } + + private void addMultiObjectsToSpec(String objectName, Locator locator) { + Page page = pageSpecProcessor.getBrowser().getPage(); + int count = page.getObjectCount(locator); + for (int index = 1; index <= count; index++) { + pageSpecProcessor.addObjectToSpec(objectName.replace("*", Integer.toString(index)), + new Locator(locator.getLocatorType(), locator.getLocatorValue(), index)); + } } private Locator readLocatorFromString(StructNode structNode, String objectName, String locatorText) { diff --git a/galen-core/src/main/java/net/mindengine/galen/speclang2/reader/pagespec/PageSpecProcessor.java b/galen-core/src/main/java/net/mindengine/galen/speclang2/reader/pagespec/PageSpecProcessor.java index e30c41d8..63749cd3 100644 --- a/galen-core/src/main/java/net/mindengine/galen/speclang2/reader/pagespec/PageSpecProcessor.java +++ b/galen-core/src/main/java/net/mindengine/galen/speclang2/reader/pagespec/PageSpecProcessor.java @@ -15,6 +15,7 @@ ******************************************************************************/ package net.mindengine.galen.speclang2.reader.pagespec; +import net.mindengine.galen.browser.Browser; import net.mindengine.galen.parser.StructNode; import net.mindengine.galen.parser.SyntaxException; import net.mindengine.galen.specs.page.Locator; @@ -24,9 +25,11 @@ public class PageSpecProcessor { private final PageSpec pageSpec; + private final Browser browser; - public PageSpecProcessor(PageSpec pageSpec) { + public PageSpecProcessor(PageSpec pageSpec, Browser browser) { this.pageSpec = pageSpec; + this.browser = browser; } public PageSpec buildPageSpec() { @@ -48,4 +51,8 @@ public void processSpecialInstruction(StructNode structNode) { public void addObjectToSpec(String objectName, Locator locator) { pageSpec.getObjects().put(objectName, locator); } + + public Browser getBrowser() { + return browser; + } } diff --git a/galen-core/src/main/java/net/mindengine/galen/speclang2/reader/pagespec/PageSpecReaderV2.java b/galen-core/src/main/java/net/mindengine/galen/speclang2/reader/pagespec/PageSpecReaderV2.java index beeae093..4a6f5d8f 100644 --- a/galen-core/src/main/java/net/mindengine/galen/speclang2/reader/pagespec/PageSpecReaderV2.java +++ b/galen-core/src/main/java/net/mindengine/galen/speclang2/reader/pagespec/PageSpecReaderV2.java @@ -15,6 +15,7 @@ ******************************************************************************/ package net.mindengine.galen.speclang2.reader.pagespec; +import net.mindengine.galen.browser.Browser; import net.mindengine.galen.parser.IndentationStructureParser; import net.mindengine.galen.parser.StructNode; import net.mindengine.galen.specs.reader.page.PageSpec; @@ -25,13 +26,13 @@ public class PageSpecReaderV2 { - public PageSpec read(String path) throws IOException { + public PageSpec read(String path, Browser browser) throws IOException { IndentationStructureParser structParser = new IndentationStructureParser(); List structs = structParser.parse(GalenUtils.findFileOrResourceAsStream(path), path); PageSpec pageSpec = new PageSpec(); - PageSpecProcessor pageSpecProcessor = new PageSpecProcessor(pageSpec); + PageSpecProcessor pageSpecProcessor = new PageSpecProcessor(pageSpec, browser); for (StructNode structNode : structs) { if (structNode.getName().startsWith("@")) { diff --git a/galen-core/src/test/java/net/mindengine/galen/tests/speclang2/pagespec/PageSpecReaderV2Test.java b/galen-core/src/test/java/net/mindengine/galen/tests/speclang2/pagespec/PageSpecReaderV2Test.java index 7bb52422..7fb5d88b 100644 --- a/galen-core/src/test/java/net/mindengine/galen/tests/speclang2/pagespec/PageSpecReaderV2Test.java +++ b/galen-core/src/test/java/net/mindengine/galen/tests/speclang2/pagespec/PageSpecReaderV2Test.java @@ -15,6 +15,9 @@ ******************************************************************************/ package net.mindengine.galen.tests.speclang2.pagespec; +import net.mindengine.galen.browser.Browser; +import net.mindengine.galen.browser.SeleniumBrowser; +import net.mindengine.galen.components.mocks.driver.MockedDriver; import net.mindengine.galen.speclang2.reader.pagespec.PageSpecReaderV2; import net.mindengine.galen.specs.page.CorrectionsRect; import net.mindengine.galen.specs.page.Locator; @@ -30,6 +33,8 @@ public class PageSpecReaderV2Test { + private static final Browser NO_BROWSER = null; + @Test public void shouldRead_objectDefinitions() throws IOException { PageSpec pageSpec = readPageSpec("speclang2/object-definitions.gspec"); @@ -50,8 +55,26 @@ public void shouldRead_objectDefinitions() throws IOException { }})); } + + @Test + public void shouldRead_objectDefinitions_withMultiObjects() throws IOException { + PageSpec pageSpec = readPageSpec("speclang2/object-definitions-multi-objects.gspec", + new SeleniumBrowser(new MockedDriver("/speclang2/mocks/menu-items.json"))); + + assertThat(pageSpec.getObjects(), is((Map)new HashMap(){{ + put("menu-item-1", new Locator("css", "#menu li", 1)); + put("menu-item-2", new Locator("css", "#menu li", 2)); + put("menu-item-3", new Locator("css", "#menu li", 3)); + put("menu-item-4", new Locator("css", "#menu li", 4)); + }})); + } + private PageSpec readPageSpec(String resource) throws IOException { - return new PageSpecReaderV2().read(resource); + return readPageSpec(resource, NO_BROWSER); + } + + private PageSpec readPageSpec(String resource, Browser browser) throws IOException { + return new PageSpecReaderV2().read(resource, browser); } } diff --git a/galen-core/src/test/resources/speclang2/mocks/menu-items.json b/galen-core/src/test/resources/speclang2/mocks/menu-items.json new file mode 100644 index 00000000..ff5c996b --- /dev/null +++ b/galen-core/src/test/resources/speclang2/mocks/menu-items.json @@ -0,0 +1,15 @@ +{ + "items": [ { + "locator": "css: #menu li", + "area": [0,0,100,10] + }, { + "locator": "css: #menu li", + "area": [0,10,100,10] + }, { + "locator": "css: #menu li", + "area": [0,20,100,10] + }, { + "locator": "css: #menu li", + "area": [0,30,100,10] + } ] +} diff --git a/galen-core/src/test/resources/speclang2/object-definitions-multi-objects.gspec b/galen-core/src/test/resources/speclang2/object-definitions-multi-objects.gspec new file mode 100644 index 00000000..af6f0b3d --- /dev/null +++ b/galen-core/src/test/resources/speclang2/object-definitions-multi-objects.gspec @@ -0,0 +1,6 @@ + + + + +@objects + menu-item-* #menu li \ No newline at end of file