/******************************************************************************* * Copyright (c) 2010-2014 SAP AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * SAP AG - initial API and implementation *******************************************************************************/ package org.eclipse.skalli.selenium.pageobjects.ext.util; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; import org.eclipse.skalli.selenium.pageobjects.AbstractPage; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.remote.RemoteWebElement; /** * This is a option list combobox which appears if you click the selection button of a field with selection */ public class OptionListCombobox extends AbstractPage { public OptionListCombobox(WebDriver driver) { super(driver); } @Override public boolean isDisplayed() { //info bar and content area elements can be closed tags -> isDisplayed returns false //previous and next scroll button elements can be hidden -> isDisplayed returns false return getComboboxSection().isDisplayed() && (getInfoBar() instanceof RemoteWebElement) && (getPreviousScrollButton() instanceof RemoteWebElement) && (getNextScrollButton() instanceof RemoteWebElement) && (getContentArea() instanceof RemoteWebElement) && areActualEntriesDisplayed(); } private boolean areActualEntriesDisplayed() { List<WebElement> actualEntries = getActualEntries(); for (Iterator<WebElement> iterator = actualEntries.iterator(); iterator.hasNext();) { WebElement webElement = (WebElement) iterator.next(); if (!webElement.isDisplayed()) { return false; } } return true; } @Override protected WebElement explicitWaitReturn() { return getComboboxSection(); } public String getInfoBarContent() { return getInfoBar().getText(); } private int[] getInfoBarNumbers() { StringTokenizer tokenizer = new StringTokenizer(getInfoBarContent(), "-/", false); //parse the numbers String fromNumber = tokenizer.nextToken(); String toNumber = tokenizer.nextToken(); String count = tokenizer.nextToken(); //convert them int[] tmp = new int[3]; try { tmp[0] = Integer.parseInt(fromNumber); tmp[1] = Integer.parseInt(toNumber); tmp[2] = Integer.parseInt(count); } catch (NumberFormatException e) { System.err.println("content not parsable - (maybe you forgot to check that the info bar contains text)\n" + e); e.printStackTrace(); } return tmp; } public int getFromNumber() { return getInfoBarNumbers()[0]; } public int getToNumber() { return getInfoBarNumbers()[1]; } public int getCount() { return getInfoBarNumbers()[2]; } public List<WebElement> getActualEntries() { List<WebElement> tmp = new ArrayList<WebElement>(); //can process the elements if (!getInfoBarContent().equals("")) { int count = getToNumber() - getFromNumber() + 1; for (int i = 0; i < count; i++) { tmp.add(getEntry(i)); } } return tmp; } public boolean arePreviousEntriesExisting() { return getFromNumber() != 1; } public boolean areNextEntriesExisting() { return getToNumber() != getCount(); } public void clickPreviousScrollButton() { getPreviousScrollButton().click(); } public void clickNextScrollButton() { getNextScrollButton().click(); } protected WebElement getComboboxSection() { return driver.findElement(By.xpath(getXPathToComboboxSection())); } protected WebElement getInfoBar() { return driver.findElement(By.xpath(getXPathToInfoBar())); } protected WebElement getPreviousScrollButton() { return driver.findElement(By.xpath(getXPathToPreviousScrollButton())); } protected WebElement getNextScrollButton() { return driver.findElement(By.xpath(getXPathToNextScrollButton())); } protected WebElement getContentArea() { return driver.findElement(By.xpath(getXPathToContentArea())); } //number is zero indexed -> number = 0 for the first entry protected WebElement getEntry(int number) { return driver.findElement(By.xpath(getXPathToEntry(number))); } private String getXPathToComboboxSection() { return ".//*[@id='VAADIN_COMBOBOX_OPTIONLIST']/div"; } private String getXPathToInfoBar() { return getXPathToComboboxSection() + "/div[4]"; } private String getXPathToPreviousScrollButton() { return getXPathToComboboxSection() + "/div[1]/span"; } private String getXPathToNextScrollButton() { return getXPathToComboboxSection() + "/div[3]/span"; } private String getXPathToContentArea() { return getXPathToComboboxSection() + "/div[2]/table/tbody"; } //number is zero indexed -> number = 0 for the first entry private String getXPathToEntry(int number) { return getXPathToContentArea() + "/tr[" + (number + 1) + "]/td/span"; } }