/* * Copyright 2016-2017 Hewlett Packard Enterprise Development Company, L.P. * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. */ package com.autonomy.abc.selenium.find.numericWidgets; import com.hp.autonomy.frontend.selenium.element.DatePicker; import com.hp.autonomy.frontend.selenium.util.AppElement; import com.hp.autonomy.frontend.selenium.util.DriverUtil; import org.openqa.selenium.By; import org.openqa.selenium.Dimension; import org.openqa.selenium.Keys; import org.openqa.selenium.Point; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.ui.ExpectedCondition; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.util.ArrayList; import java.util.Date; import java.util.List; public class MainNumericWidget extends AppElement { private final WebElement container; private final WebDriver driver; private final NumericWidget chart; public MainNumericWidget(final WebDriver driver) { super(driver.findElement(By.className("middle-container-time-bar")), driver); this.driver = driver; container = driver.findElement(By.className("middle-container-time-bar")); chart = new NumericWidget(driver, container); } //Around the graph/chart public void closeWidget() { findElement(By.cssSelector(".hp-close.time-bar-container-icon")).click(); } public void reset() { findElement(By.className("numeric-parametric-reset")).click(); } public void noMin() { findElement(By.className("numeric-parametric-no-min")).click(); } public void noMax() { findElement(By.className("numeric-parametric-no-max")).click(); } public double setAndGetFullRange() { noMin(); noMax(); return getRange(); } public double getRange() { return Double.parseDouble(maxFieldValue()) - Double.parseDouble(minFieldValue()); } public WebElement errorMessage() { return findElement(By.className("numeric-parametric-error-text")); } public String hoverMessage() { return findElement(By.className("numeric-parametric-co-ordinates")).getText(); } public WebElement messageRow() { return findElement(By.cssSelector(".numeric-parametric-inputs")); } public String header() { return findElement(By.className("time-bar-header")).getText(); } //Actual graph public WebElement graph() { return chart.getContainer(); } public NumericWidget graphAsWidget() { return chart; } public int graphWidth() { return Integer.parseInt(graph().getAttribute("width")); } public void selectHalfTheBars() { selectFractionOfBars(1, 2); } public void selectFractionOfBars(final int i, final int j) { final List<WebElement> bars = graphAsWidget().barsWithResults(); final int index = bars.size() * i / j; final WebElement bar = bars.get(index); DriverUtil.clickAndDrag(100, bar, driver); } //Waits public void waitUntilWidgetLoaded() { new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(By.className("numeric-parametric-loading-indicator"))); } public void waitUntilRectangleBack() { new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOf(graphAsWidget().selectionRec())); } public void waitUntilDatePickerGone() { new WebDriverWait(driver, 20).until(calendarPopUpsGone()); } private ExpectedCondition<Boolean> calendarPopUpsGone() { return (WebDriver webdriver) -> findElements(By.cssSelector("div.bootstrap-datetimepicker-widget")).size() < 1; } public void rectangleHoverRight() { final Dimension dimensions = graphAsWidget().selectionRec().getSize(); DriverUtil.hoveringOffSide(graphAsWidget().selectionRec(), new Point(dimensions.getWidth(), dimensions.getHeight() / 100), driver); } public void rectangleHoverLeft() { final Dimension dimensions = graphAsWidget().selectionRec().getSize(); DriverUtil.hoveringOffSide(graphAsWidget().selectionRec(), new Point(0, dimensions.getHeight() / 100), driver); } //Getting date field values public String minFieldValue() { return fieldValue(LimitType.min); } public String maxFieldValue() { return fieldValue(LimitType.max); } private String fieldValue(final LimitType limit) { return findElement(By.cssSelector(".numeric-parametric-" + limit + "-input")).getAttribute("value"); } public List<Date> getDates() { final List<Date> dates = new ArrayList<>(); dates.add(parseTheDates(minFieldValue())); dates.add(parseTheDates(maxFieldValue())); return dates; } //DATE FORMAT: YYYY-MM-DD hh:mm private Date parseTheDates(final String stringDate) { final String date = stringDate.split(" ")[0]; final String[] dateParts = date.split("-"); return new Date(Integer.parseInt(dateParts[0]) - 1900, Integer.parseInt(dateParts[1]), Integer.parseInt(dateParts[2])); } //Setting date field values private WebElement inputBox(final LimitType limit) { return findElement(By.className("numeric-parametric-" + limit + "-input")); } public void setMinValueViaText(final String value) { inputValue(value, minFieldValue().length(), inputBox(LimitType.min)); } public void setMaxValueViaText(final String value) { inputValue(value, maxFieldValue().length(), inputBox(LimitType.max)); } //FormInput class is not used because the in-built clear and submit methods don't work w/ these boxes private void inputValue(final String term, final int length, final WebElement inputBox) { waitUntilWidgetLoaded(); for(int i = 0; i < length; i++) { inputBox.sendKeys(Keys.BACK_SPACE); } inputBox.sendKeys(term); inputBox.sendKeys(Keys.ENTER); waitUntilWidgetLoaded(); } //Setting date via calendars public WebElement startCalendar() { return findElement(By.cssSelector(".input-group[data-date-attribute='min-date']")); } public WebElement endCalendar() { return findElement(By.cssSelector(".input-group[data-date-attribute='max-date']")); } public DatePicker openCalendar(final WebElement dateInput) { dateInput.findElement(By.className("hp-calendar")).click(); new WebDriverWait(getDriver(), 3).until(new ExpectedCondition<Boolean>() { @Override public Boolean apply(final WebDriver driver) { return calendarHasOpened(); } }); return new DatePicker(dateInput, driver); } public Boolean calendarHasOpened() { return !findElements(By.cssSelector(".datepicker-days .picker-switch")).isEmpty(); } private enum LimitType { max, min } }