From cef16d01e92dae4fd770ac3e694aea5adf05f7f1 Mon Sep 17 00:00:00 2001 From: anttil <anttil> Date: Tue, 2 Oct 2012 13:38:00 +0000 Subject: [PATCH] SWE-2 / SP-314 : Static tab browsing implemented, some cleanup on web element waits. SVN: 26939 --- .../application/GuiApplicationRunner.java | 163 +++++++++++++----- .../uitest/infra/webdriver/Context.java | 28 +++ .../uitest/infra/webdriver/PageProxy.java | 21 +++ .../cisd/openbis/uitest/page/menu/TabBar.java | 44 +++++ .../cisd/openbis/uitest/page/tab/Browser.java | 29 ++++ .../openbis/uitest/suite/DataSetTest.java | 2 + .../openbis/uitest/suite/SeleniumTest.java | 2 +- .../openbis/uitest/widget/FilterToolBar.java | 16 +- .../cisd/openbis/uitest/widget/Grid.java | 16 +- .../openbis/uitest/widget/PagingToolBar.java | 28 +-- .../cisd/openbis/uitest/widget/Text.java | 14 -- 11 files changed, 263 insertions(+), 100 deletions(-) create mode 100644 ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/Context.java create mode 100644 ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/menu/TabBar.java diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/application/GuiApplicationRunner.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/application/GuiApplicationRunner.java index fa473763211..e9b5592044c 100644 --- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/application/GuiApplicationRunner.java +++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/application/GuiApplicationRunner.java @@ -28,6 +28,7 @@ import ch.systemsx.cisd.openbis.uitest.page.dialog.EditSampleTypeDialog; import ch.systemsx.cisd.openbis.uitest.page.menu.AdminMenu; import ch.systemsx.cisd.openbis.uitest.page.menu.BrowseMenu; import ch.systemsx.cisd.openbis.uitest.page.menu.NewMenu; +import ch.systemsx.cisd.openbis.uitest.page.menu.TabBar; import ch.systemsx.cisd.openbis.uitest.page.menu.TopBar; import ch.systemsx.cisd.openbis.uitest.page.menu.UserMenu; import ch.systemsx.cisd.openbis.uitest.page.tab.AddPropertyType; @@ -104,6 +105,7 @@ public class GuiApplicationRunner implements ApplicationRunner { browser.delete(); } + browser.resetFilters(); } public void deleteExperimentsFrom(Project project) @@ -125,6 +127,7 @@ public class GuiApplicationRunner implements ApplicationRunner { browser.delete(); } + browser.resetFilters(); } @Override @@ -137,6 +140,7 @@ public class GuiApplicationRunner implements ApplicationRunner { browser.delete(); } + browser.resetFilters(); } @Override @@ -149,6 +153,7 @@ public class GuiApplicationRunner implements ApplicationRunner { browser.delete(); } + browser.resetFilters(); } @Override @@ -174,6 +179,7 @@ public class GuiApplicationRunner implements ApplicationRunner { browser.delete(); } + browser.resetFilters(); } @Override @@ -274,6 +280,7 @@ public class GuiApplicationRunner implements ApplicationRunner EditSampleTypeDialog dialog = proxy.get(EditSampleTypeDialog.class); dialog.fillWith(sampleType); dialog.save(); + browser.resetFilters(); } @Override @@ -356,42 +363,64 @@ public class GuiApplicationRunner implements ApplicationRunner load(browserClass).showColumnsOf(browsable); load(browserClass).filterTo(browsable); List<BrowserRow> rows = load(browserClass).getData(); - if (rows.size() == 0) + try { - return new BrowserRow(); - } else if (rows.size() == 1) + if (rows.size() == 0) + { + return new BrowserRow(); + } else if (rows.size() == 1) + { + return rows.get(0); + } else + { + throw new IllegalStateException("multiple rows found:\n" + rows); + } + } finally { - return rows.get(0); - } else - { - throw new IllegalStateException("multiple rows found:\n" + rows); + load(browserClass).resetFilters(); } } public SampleTypeBrowser browseToSampleTypeBrowser() { - getMenus().admin(); - load(AdminMenu.class).sampleTypes(); + boolean success = load(TabBar.class).selectTab("Sample Types"); + if (!success) + { + getMenus().admin(); + load(AdminMenu.class).sampleTypes(); + } return getBrowser(SampleTypeBrowser.class); } public ExperimentTypeBrowser browseToExperimentTypeBrowser() { - getMenus().admin(); - load(AdminMenu.class).experimentTypes(); + boolean success = load(TabBar.class).selectTab("Experiment Types"); + if (!success) + { + getMenus().admin(); + load(AdminMenu.class).experimentTypes(); + } return getBrowser(ExperimentTypeBrowser.class); } public DataSetTypeBrowser browseToDataSetTypeBrowser() { - getMenus().admin(); - load(AdminMenu.class).dataSetTypes(); + boolean success = load(TabBar.class).selectTab("Data Set Types"); + if (!success) + { + getMenus().admin(); + load(AdminMenu.class).dataSetTypes(); + } return getBrowser(DataSetTypeBrowser.class); } public void emptyTrash() { - getMenus().trash(); + boolean success = load(TabBar.class).selectTab("Trash"); + if (!success) + { + getMenus().trash(); + } load(Trash.class).empty(); } @@ -409,15 +438,23 @@ public class GuiApplicationRunner implements ApplicationRunner public SpaceBrowser browseToSpaceBrowser() { - getMenus().admin(); - load(AdminMenu.class).spaces(); + boolean success = load(TabBar.class).selectTab("Space Browser"); + if (!success) + { + getMenus().admin(); + load(AdminMenu.class).spaces(); + } return getBrowser(SpaceBrowser.class); } public ProjectBrowser browseToProjectBrowser() { - getMenus().browse(); - load(BrowseMenu.class).projects(); + boolean success = load(TabBar.class).selectTab("Project Browser"); + if (!success) + { + getMenus().browse(); + load(BrowseMenu.class).projects(); + } return getBrowser(ProjectBrowser.class); } @@ -429,30 +466,45 @@ public class GuiApplicationRunner implements ApplicationRunner public SampleBrowser browseToSampleBrowser() { - getMenus().browse(); - load(BrowseMenu.class).samples(); - load(SampleBrowser.class).allSpaces(); + boolean success = load(TabBar.class).selectTab("Sample Browser"); + if (!success) + { + getMenus().browse(); + load(BrowseMenu.class).samples(); + } return getBrowser(SampleBrowser.class); } public ExperimentBrowser browseToExperimentBrowser() { - getMenus().browse(); - load(BrowseMenu.class).experiments(); + boolean success = load(TabBar.class).selectTab("Experiment Browser"); + if (!success) + { + getMenus().browse(); + load(BrowseMenu.class).experiments(); + } return load(ExperimentBrowser.class); } public RoleAssignmentBrowser browseToRoleAssignmentBrowser() { - getMenus().admin(); - load(AdminMenu.class).roles(); + boolean success = load(TabBar.class).selectTab("Role Assignment Browser"); + if (!success) + { + getMenus().admin(); + load(AdminMenu.class).roles(); + } return getBrowser(RoleAssignmentBrowser.class); } public VocabularyBrowser browseToVocabularyBrowser() { - getMenus().admin(); - load(AdminMenu.class).vocabularies(); + boolean success = load(TabBar.class).selectTab("Vocabulary Browser"); + if (!success) + { + getMenus().admin(); + load(AdminMenu.class).vocabularies(); + } return getBrowser(VocabularyBrowser.class); } @@ -464,50 +516,78 @@ public class GuiApplicationRunner implements ApplicationRunner public PropertyTypeBrowser browseToPropertyTypeBrowser() { - getMenus().admin(); - load(AdminMenu.class).browsePropertyTypes(); + boolean success = load(TabBar.class).selectTab("Property Types"); + if (!success) + { + getMenus().admin(); + load(AdminMenu.class).browsePropertyTypes(); + } return getBrowser(PropertyTypeBrowser.class); } public AddPropertyType browseToAddPropertyType() { - getMenus().admin(); - load(AdminMenu.class).newPropertyType(); + boolean success = load(TabBar.class).selectTab("Property Type Registration"); + if (!success) + { + getMenus().admin(); + load(AdminMenu.class).newPropertyType(); + } return load(AddPropertyType.class); } public AssignSamplePropertyType browseToAssignSamplePropertyType() { - getMenus().admin(); - load(AdminMenu.class).assignPropertyTypeToSampleType(); + boolean success = load(TabBar.class).selectTab("Assign Sample Property Type"); + if (!success) + { + getMenus().admin(); + load(AdminMenu.class).assignPropertyTypeToSampleType(); + } return load(AssignSamplePropertyType.class); } public PropertyTypeAssignmentBrowser browseToPropertyTypeAssignmentBrowser() { - getMenus().admin(); - load(AdminMenu.class).browsePropertyTypeAssignments(); + boolean success = load(TabBar.class).selectTab("Property Type Assignments"); + if (!success) + { + getMenus().admin(); + load(AdminMenu.class).browsePropertyTypeAssignments(); + } return getBrowser(PropertyTypeAssignmentBrowser.class); } public RegisterSample browseToRegisterSample() { - getMenus().newMenu(); - load(NewMenu.class).sample(); + boolean success = load(TabBar.class).selectTab("Sample Registration"); + if (!success) + { + getMenus().newMenu(); + load(NewMenu.class).sample(); + } return load(RegisterSample.class); } public RegisterExperiment browseToRegisterExperiment() { - getMenus().newMenu(); - load(NewMenu.class).experiment(); + boolean success = load(TabBar.class).selectTab("Experiment Registration"); + if (!success) + { + getMenus().newMenu(); + load(NewMenu.class).experiment(); + } return load(RegisterExperiment.class); } public RegisterProject browseToRegisterProject() { - getMenus().newMenu(); - load(NewMenu.class).project(); + boolean success = load(TabBar.class).selectTab("Project Registration"); + if (!success) + { + getMenus().newMenu(); + load(NewMenu.class).project(); + } return load(RegisterProject.class); } @@ -519,7 +599,6 @@ public class GuiApplicationRunner implements ApplicationRunner private <T extends Browser<?>> T getBrowser(Class<T> clazz) { T browser = load(clazz); - browser.resetFilters(); return browser; } diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/Context.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/Context.java new file mode 100644 index 00000000000..f29277cc043 --- /dev/null +++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/Context.java @@ -0,0 +1,28 @@ +/* + * Copyright 2012 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.openbis.uitest.infra.webdriver; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Context +{ +} diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/PageProxy.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/PageProxy.java index 2d23e32abda..2d71071e74f 100644 --- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/PageProxy.java +++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/infra/webdriver/PageProxy.java @@ -154,6 +154,27 @@ public class PageProxy ex.printStackTrace(); throw new RuntimeException(ex); } + + } + + Context context = field.getAnnotation(Context.class); + if (context != null) + { + field.setAccessible(true); + try + { + field.set(t, new WidgetContext(SeleniumTest.driver.findElement(By + .xpath("/html")), + shotter)); + } catch (IllegalArgumentException ex) + { + ex.printStackTrace(); + throw new RuntimeException(ex); + } catch (IllegalAccessException ex) + { + ex.printStackTrace(); + throw new RuntimeException(ex); + } } } diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/menu/TabBar.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/menu/TabBar.java new file mode 100644 index 00000000000..9dd262a8223 --- /dev/null +++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/menu/TabBar.java @@ -0,0 +1,44 @@ +/* + * Copyright 2012 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.openbis.uitest.page.menu; + +import org.openqa.selenium.WebElement; + +import ch.systemsx.cisd.openbis.uitest.infra.webdriver.Context; +import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetContext; + +public class TabBar +{ + @Context + private WidgetContext context; + + public boolean selectTab(String label) + { + + for (WebElement link : context + .findAll("//li[starts-with(@id, 'openbis_main-tab-panel__')]")) + { + if (link.getText().equals(label)) + { + link.click(); + return true; + } + } + return false; + } + +} diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/Browser.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/Browser.java index 72f7267ee6c..3f108fc0451 100644 --- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/Browser.java +++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/page/tab/Browser.java @@ -17,6 +17,11 @@ package ch.systemsx.cisd.openbis.uitest.page.tab; import java.util.List; +import java.util.concurrent.TimeUnit; + +import org.openqa.selenium.support.ui.FluentWait; + +import com.google.common.base.Predicate; import ch.systemsx.cisd.openbis.uitest.type.Browsable; import ch.systemsx.cisd.openbis.uitest.widget.FilterToolBar; @@ -45,18 +50,24 @@ public abstract class Browser<T extends Browsable> public final void filterTo(T browsable) { + waitForPagingToolBar(); getPaging().filters(); getFilters().setCode(browsable.getCode(), getPaging()); } public final void resetFilters() { + waitForPagingToolBar(); getPaging().filters(); getFilters().reset(); } public final void showColumnsOf(T browsable) { + if (getGrid().getColumnNames().containsAll(browsable.getColumns())) + { + return; + } getPaging().settings(); getSettings().showColumnsOf(browsable); } @@ -73,4 +84,22 @@ public abstract class Browser<T extends Browsable> return s + getGrid().toString(); } + private void waitForPagingToolBar() + { + new FluentWait<PagingToolBar>(getPaging()) + { + + }.withTimeout(30, TimeUnit.SECONDS).pollingEvery(100, TimeUnit.MILLISECONDS).until( + new Predicate<PagingToolBar>() + { + + @Override + public boolean apply(PagingToolBar paging) + { + System.out.println("waiting for paging toolbar to get enabled"); + return paging.isEnabled(); + } + }); + } + } diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/DataSetTest.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/DataSetTest.java index ba77424da99..9c22e1e7d67 100644 --- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/DataSetTest.java +++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/DataSetTest.java @@ -40,6 +40,8 @@ public class DataSetTest extends SeleniumTest System.out.println(dataset.getCode()); + // assertThat(detailsOf(sample), containsDataSet(dataset)); + // assertThat(dataSetBrowserOf(sample), lists(dataset)); } diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SeleniumTest.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SeleniumTest.java index e169579a487..19e778653bf 100644 --- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SeleniumTest.java +++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/suite/SeleniumTest.java @@ -177,7 +177,7 @@ public abstract class SeleniumTest }), uid); openbis.login(ADMIN_USER, ADMIN_PASSWORD); // this is because of BIS-184 - openbis.browseToSampleBrowser(); + openbis.browseToSampleBrowser().allSpaces(); openbisApi.login(ADMIN_USER, ADMIN_PASSWORD); } diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/FilterToolBar.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/FilterToolBar.java index 2966475c37c..7dd52cd5a01 100644 --- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/FilterToolBar.java +++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/FilterToolBar.java @@ -40,14 +40,6 @@ public class FilterToolBar implements Widget @Override public Void execute() { - try - { - Thread.sleep(2000); - } catch (InterruptedException ex) - { - // TODO Auto-generated catch block - ex.printStackTrace(); - } t.clear(); t.sendKeys(text); return null; @@ -59,13 +51,7 @@ public class FilterToolBar implements Widget public void reset() { WebElement b = context.find(".//button[text()='Reset']"); - if (b.isEnabled() && b.isDisplayed()) - { - b.click(); - } else - { - reset(); - } + b.click(); } @Override diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Grid.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Grid.java index 95195dbc30d..39b1d3ac33d 100644 --- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Grid.java +++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Grid.java @@ -93,11 +93,7 @@ public class Grid implements Widget public List<BrowserRow> getData() { - List<String> columns = new ArrayList<String>(); - for (WebElement column : getColumns()) - { - columns.add(column.getText()); - } + List<String> columns = getColumnNames(); List<BrowserRow> result = new ArrayList<BrowserRow>(); Map<String, BrowserCell> map = new HashMap<String, BrowserCell>(); @@ -118,6 +114,16 @@ public class Grid implements Widget return result; } + public List<String> getColumnNames() + { + List<String> columns = new ArrayList<String>(); + for (WebElement column : getColumns()) + { + columns.add(column.getText()); + } + return columns; + } + private List<WebElement> getColumns() { return context diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/PagingToolBar.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/PagingToolBar.java index 0d6ba180be2..820a348bf25 100644 --- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/PagingToolBar.java +++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/PagingToolBar.java @@ -16,13 +16,6 @@ package ch.systemsx.cisd.openbis.uitest.widget; -import java.util.concurrent.TimeUnit; - -import org.openqa.selenium.WebElement; -import org.openqa.selenium.support.ui.FluentWait; - -import com.google.common.base.Predicate; - import ch.systemsx.cisd.openbis.uitest.infra.webdriver.WidgetContext; /** @@ -45,22 +38,6 @@ public class PagingToolBar implements Widget, Refreshable public void settings() { Button b = context.find(".//button[text()='Settings']", Button.class); - - new FluentWait<WebElement>(context) - { - - }.withTimeout(30, TimeUnit.SECONDS).pollingEvery(100, TimeUnit.MILLISECONDS).until( - new Predicate<WebElement>() - { - - @Override - public boolean apply(WebElement element) - { - System.out.println("waiting for paging toolbar to get enabled"); - return !context.getAttribute("class").contains("x-item-disabled"); - } - }); - b.click(); } @@ -98,4 +75,9 @@ public class PagingToolBar implements Widget, Refreshable } return result; } + + public boolean isEnabled() + { + return !context.getAttribute("class").contains("x-item-disabled"); + } } diff --git a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Text.java b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Text.java index b707344d499..2d8655aff46 100644 --- a/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Text.java +++ b/ui-test/source/java/ch/systemsx/cisd/openbis/uitest/widget/Text.java @@ -38,20 +38,6 @@ public class Text implements AtomicWidget, Fillable public void append(String text) { - if (context.isInteractable() == false) - { - System.out.println("text retry"); - try - { - Thread.sleep(500); - } catch (InterruptedException ex) - { - // TODO Auto-generated catch block - ex.printStackTrace(); - } - append(text); - return; - } context.sendKeys(text); } -- GitLab