From 915e9ffbf9344b20f87e2d19d6de02027dcc9013 Mon Sep 17 00:00:00 2001 From: Igor Ohrimenko Date: Thu, 11 Oct 2018 10:31:15 +0300 Subject: [PATCH] [Selenium] Fix unexpected fail of "AutocompleteFeaturesInEditorTest" selenium test (#11565) --- .../selenium/pageobject/FileStructure.java | 35 +++++++++++++++---- .../selenium/pageobject/ProjectExplorer.java | 17 +++++++++ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/pageobject/FileStructure.java b/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/pageobject/FileStructure.java index ef57369acd..9d9f391c37 100644 --- a/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/pageobject/FileStructure.java +++ b/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/pageobject/FileStructure.java @@ -12,6 +12,8 @@ package org.eclipse.che.selenium.pageobject; import static java.lang.String.format; +import static org.eclipse.che.selenium.pageobject.FileStructure.Locators.FILE_STRUCTURE_ITEM; +import static org.eclipse.che.selenium.pageobject.FileStructure.Locators.SELECTED_FILE_STRUCTURE_ITEM_XPATH_TEMPLATE; import static org.openqa.selenium.Keys.CONTROL; import static org.openqa.selenium.Keys.ENTER; import static org.openqa.selenium.Keys.ESCAPE; @@ -46,7 +48,7 @@ public class FileStructure { PageFactory.initElements(seleniumWebDriver, this); } - private interface Locators { + public interface Locators { String FILE_STRUCTURE_FORM = "//table[@title='%s.java']"; String FILE_STRUCTURE_CLOSE_ICON = "gwt-debug-file-structure-windowFrameCloseButton"; String FILE_STRUCTURE_CONTENT = "gwt-debug-file-structure-mainPanel"; @@ -54,6 +56,8 @@ public class FileStructure { "(//div[text()='%s']/preceding::*[local-name()='svg'][2])[last()]"; String FILE_STRUCTURE_ITEM = "//div[@id='gwt-debug-file-structure-mainPanel']//div[text()='%s']"; + String SELECTED_FILE_STRUCTURE_ITEM_XPATH_TEMPLATE = + "//div[@id='gwt-debug-file-structure-mainPanel']//div[contains(@class, 'selected')]//div[text()='%s']"; } @FindBy(id = Locators.FILE_STRUCTURE_CONTENT) @@ -140,11 +144,13 @@ public class FileStructure { * @param item is the name of the item */ public void selectItemInFileStructureByDoubleClick(String item) { + final String itemXpath = getItemXpath(item); + // we need to wait a little to avoid node closing after quick clicking WaitUtils.sleepQuietly(1); seleniumWebDriverHelper.waitNoExceptions( - () -> seleniumWebDriverHelper.moveCursorToAndDoubleClick(getFileStructureItem(item)), + () -> seleniumWebDriverHelper.moveCursorToAndDoubleClick(By.xpath(itemXpath)), StaleElementReferenceException.class); } @@ -163,12 +169,29 @@ public class FileStructure { * @param item is the name of the item */ public void selectItemInFileStructure(String item) { - seleniumWebDriverHelper.waitAndClick(getFileStructureItem(item)); + seleniumWebDriverHelper.waitNoExceptions( + () -> selectItem(item), StaleElementReferenceException.class); } - private WebElement getFileStructureItem(String item) { - return seleniumWebDriverHelper.waitVisibility( - By.xpath(format(Locators.FILE_STRUCTURE_ITEM, item))); + private void selectItem(String visibleItemText) { + final String itemXpath = getItemXpath(visibleItemText); + + seleniumWebDriverHelper.waitAndClick(By.xpath(itemXpath)); + waitItemSelected(visibleItemText); + } + + private String getItemXpath(String item) { + return format(FILE_STRUCTURE_ITEM, item); + } + + private String getSelectedItemXpath(String itemText) { + return format(SELECTED_FILE_STRUCTURE_ITEM_XPATH_TEMPLATE, itemText); + } + + public void waitItemSelected(String itemText) { + final String selectedItemXpath = getSelectedItemXpath(itemText); + + seleniumWebDriverHelper.waitVisibility(By.xpath(selectedItemXpath)); } /** diff --git a/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/pageobject/ProjectExplorer.java b/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/pageobject/ProjectExplorer.java index 404e466484..2088be372d 100644 --- a/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/pageobject/ProjectExplorer.java +++ b/selenium/che-selenium-test/src/main/java/org/eclipse/che/selenium/pageobject/ProjectExplorer.java @@ -28,6 +28,7 @@ import static org.eclipse.che.selenium.pageobject.ProjectExplorer.Locators.COLOU import static org.eclipse.che.selenium.pageobject.ProjectExplorer.Locators.EXPLORER_RIGHT_TAB_ID; import static org.eclipse.che.selenium.pageobject.ProjectExplorer.Locators.PROJECT_EXPLORER_ITEM_TEMPLATE; import static org.eclipse.che.selenium.pageobject.ProjectExplorer.Locators.PROJECT_EXPLORER_TREE_ITEMS; +import static org.eclipse.che.selenium.pageobject.ProjectExplorer.Locators.SELECTED_ITEM_BY_NAME_XPATH_TEMPLATE; import static org.eclipse.che.selenium.pageobject.ProjectExplorer.ProjectExplorerItemColors.BLUE; import static org.eclipse.che.selenium.pageobject.ProjectExplorer.ProjectExplorerItemColors.DEFAULT; import static org.eclipse.che.selenium.pageobject.ProjectExplorer.ProjectExplorerItemColors.GREEN; @@ -182,6 +183,9 @@ public class ProjectExplorer { String COLOURED_ITEM_TEMPLATE = "//div[@id='gwt-debug-projectTree']//div[@path='/%s']/descendant::div[@style='%s']"; String MAXIMIZE_BUTTON_XPATH = "(//div[@id='gwt-debug-maximizeButton'])[position()=1]"; + String SELECTED_ITEM_BY_NAME_XPATH_TEMPLATE = + "//div[contains(@class, 'selected')]//div[text()='%s']"; + // "//div[@name='%s' or @name='%s.class']//div[contains(@class, 'selected')] "; } /** @@ -571,7 +575,14 @@ public class ProjectExplorer { * @param name item's visible name */ public void openItemByVisibleNameInExplorer(String name) { + seleniumWebDriverHelper.waitNoExceptions( + () -> openItemByVisibleName(name), StaleElementReferenceException.class); + } + + private void openItemByVisibleName(String name) { + waitVisibilityByName(name).click(); + waitItemSelectedByName(name); actionsFactory .createAction(seleniumWebDriver) .moveToElement(waitVisibilityByName(name)) @@ -1095,6 +1106,12 @@ public class ProjectExplorer { ELEMENT_TIMEOUT_SEC); } + public void waitItemSelectedByName(String visibleName) { + final String itemXpath = format(SELECTED_ITEM_BY_NAME_XPATH_TEMPLATE, visibleName); + + seleniumWebDriverHelper.waitVisibility(By.xpath(itemXpath)); + } + /** * Waits until all items with specified {@code paths} be selected *