org.eclipse.che.selenium.pageobject.dashboard.organization.AddMember.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.che.selenium.pageobject.dashboard.organization.AddMember.java

Source

/*
 * Copyright (c) 2012-2018 Red Hat, Inc.
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *   Red Hat, Inc. - initial API and implementation
 */
package org.eclipse.che.selenium.pageobject.dashboard.organization;

import static org.eclipse.che.selenium.core.constant.TestTimeoutsConstants.REDRAW_UI_ELEMENTS_TIMEOUT_SEC;

import com.google.common.base.Function;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.eclipse.che.selenium.core.SeleniumWebDriver;
import org.eclipse.che.selenium.core.utils.WaitUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.WebDriverWait;

/** @author Sergey Skorik */
@Singleton
public class AddMember {

    private interface Locators {
        String ADD_MEMBER_TITLE_XPATH = "//div[contains(@class, 'che-popup')]//div[text() = 'Invite member to collaborate']";
        String ADD_MEMBER_WIDGET_XPATH = ADD_MEMBER_TITLE_XPATH + "/ancestor::che-popup";
        String CLOSE_WIDGET_ICON_XPATH = "//div[@ng-click = 'onClose()']";
        String MEMBERS_EMAIL_INPUT_XPATH = "//input[@name = 'email']";
        String MEMBER_RADIO_BUTTON_XPATH = "//md-radio-button[@value='MEMBER' or @value='TEAM_MEMBER']";
        String ADMIN_RADIO_BUTTON_XPATH = "//md-radio-button[@value='ADMIN' or @value='TEAM_ADMIN']";
        String ADD_MEMBER_BUTTON_XPATH = "//che-button-primary[@che-button-title = 'Add']//button";
        String CANCEL_BUTTON_XPATH = "//che-button-cancel-flat//button";
        String SAVE_BUTTON_XPATH = "//che-button-primary[@che-button-title =  'Save']/button";
        String DELETE_BUTTON = "//che-button-primary[@che-button-title =  'Delete']/button";
        String EDIT_PERMISSIONS_BUTTON = "//span[text() = '%s']/ancestor::div[2]//div//a[@uib-tooltip =  'Edit developer permissions']";
    }

    private static final String TITLE = "Invite member to collaborate";

    @FindBy(xpath = Locators.ADD_MEMBER_TITLE_XPATH)
    WebElement addMemberTitle;

    @FindBy(xpath = Locators.CLOSE_WIDGET_ICON_XPATH)
    WebElement closeWidget;

    @FindBy(xpath = Locators.MEMBERS_EMAIL_INPUT_XPATH)
    WebElement membersEmail;

    @FindBy(xpath = Locators.MEMBER_RADIO_BUTTON_XPATH)
    WebElement memberRadioButton;

    @FindBy(xpath = Locators.ADMIN_RADIO_BUTTON_XPATH)
    WebElement adminRadioButton;

    @FindBy(xpath = Locators.ADD_MEMBER_BUTTON_XPATH)
    WebElement addMemberButton;

    @FindBy(xpath = Locators.CANCEL_BUTTON_XPATH)
    WebElement cancelButton;

    @FindBy(xpath = Locators.SAVE_BUTTON_XPATH)
    WebElement saveButton;

    @FindBy(xpath = Locators.DELETE_BUTTON)
    WebElement deleteButton;

    @FindBy(xpath = Locators.EDIT_PERMISSIONS_BUTTON)
    WebElement editPermissionsButton;

    private final SeleniumWebDriver seleniumWebDriver;
    private final WebDriverWait redrawUiElementsTimeout;

    @Inject
    public AddMember(SeleniumWebDriver seleniumWebDriver) {
        this.seleniumWebDriver = seleniumWebDriver;
        this.redrawUiElementsTimeout = new WebDriverWait(seleniumWebDriver, REDRAW_UI_ELEMENTS_TIMEOUT_SEC);
        PageFactory.initElements(seleniumWebDriver, this);
    }

    public void waitAddMemberWidget() {
        this.waitForPopupAppearence(Locators.ADD_MEMBER_WIDGET_XPATH);
    }

    public void setMembersEmail(String email) {
        redrawUiElementsTimeout.until(ExpectedConditions.visibilityOf(membersEmail)).clear();
        redrawUiElementsTimeout.until(ExpectedConditions.visibilityOf(membersEmail)).sendKeys(email);
        redrawUiElementsTimeout.until(ExpectedConditions.visibilityOf(membersEmail)).getText().equals(email);
    }

    public void onlySetMembersEmail(String email) {
        redrawUiElementsTimeout.until(ExpectedConditions.visibilityOf(membersEmail)).clear();
        redrawUiElementsTimeout.until(ExpectedConditions.visibilityOf(membersEmail)).sendKeys(email);
    }

    public WebElement getMembersEmailElement() {
        return membersEmail;
    }

    public String getMembersEmailValue() {
        return membersEmail.getAttribute("value");
    }

    public void clickMemberButton() {
        redrawUiElementsTimeout.until(ExpectedConditions.visibilityOf(memberRadioButton)).click();
    }

    public void clickAdminButton() {
        redrawUiElementsTimeout.until(ExpectedConditions.visibilityOf(adminRadioButton)).click();
    }

    public void waitForWidgetClosed() {
        this.waitForElementDisappearance(Locators.ADD_MEMBER_TITLE_XPATH);
    }

    public void closeWidget() {
        new WebDriverWait(seleniumWebDriver, REDRAW_UI_ELEMENTS_TIMEOUT_SEC)
                .until(ExpectedConditions.visibilityOf(closeWidget)).click();
    }

    public boolean checkAddButtonIsEnabled() {
        return redrawUiElementsTimeout.until(ExpectedConditions.visibilityOf(addMemberButton)).isEnabled();
    }

    public void clickAddButton() {
        redrawUiElementsTimeout.until(ExpectedConditions.visibilityOf(addMemberButton)).click();
        WaitUtils.sleepQuietly(1);
    }

    public void clickCancelButton() {
        redrawUiElementsTimeout.until(ExpectedConditions.visibilityOf(cancelButton)).click();
    }

    public void clickSaveButton() {
        redrawUiElementsTimeout.until(ExpectedConditions.visibilityOf(saveButton)).click();
    }

    public void clickDeleteButton() {
        redrawUiElementsTimeout.until(ExpectedConditions.visibilityOf(saveButton)).click();
    }

    public void clickEditPermissionsButton(String email) {
        redrawUiElementsTimeout.until(ExpectedConditions
                .visibilityOfElementLocated(By.xpath(String.format(Locators.EDIT_PERMISSIONS_BUTTON, email))))
                .click();
    }

    private void waitForElementDisappearance(String xpath) {
        FluentWait<WebDriver> wait = new FluentWait<WebDriver>(seleniumWebDriver)
                .withTimeout(REDRAW_UI_ELEMENTS_TIMEOUT_SEC, TimeUnit.SECONDS)
                .pollingEvery(200, TimeUnit.MILLISECONDS).ignoring(StaleElementReferenceException.class);

        wait.until((Function<WebDriver, Boolean>) driver -> {
            List<WebElement> elements = seleniumWebDriver.findElements(By.xpath(xpath));
            return elements.isEmpty() || elements.get(0).isDisplayed();
        });
    }

    /**
     * Wait for popup is attached to DOM and animation ends.
     *
     * @param xpath xpath to match the 'che-popup' element
     */
    private void waitForPopupAppearence(String xpath) {
        FluentWait<WebDriver> wait = new FluentWait<WebDriver>(seleniumWebDriver)
                .withTimeout(REDRAW_UI_ELEMENTS_TIMEOUT_SEC, TimeUnit.SECONDS)
                .pollingEvery(200, TimeUnit.MILLISECONDS).ignoring(StaleElementReferenceException.class);

        Map<String, Integer> lastSize = new HashMap<>();
        lastSize.put("height", 0);
        lastSize.put("width", 0);

        wait.until((Function<WebDriver, Boolean>) driver -> {
            List<WebElement> elements = seleniumWebDriver.findElements(By.xpath(xpath));
            if (elements.isEmpty()) {
                return false;
            }

            Dimension size = elements.get(0).getSize();
            if (lastSize.get("height") < size.getHeight() || lastSize.get("width") < size.getHeight()) {
                lastSize.put("height", size.getHeight());
                lastSize.put("width", size.getWidth());

                return false;
            }

            return true;
        });
    }
}