Skip to content

Métodos auxiliares para conversão entre as classes Element WebElement

ThiagoNicolielo edited this page Mar 14, 2017 · 2 revisions

Bom, não sei se há forma mais simples de conversão entre objetos Element e WebElement, ou mesmo se não é necessário isto, mas eu acabo precisando convertê-los para utilizar algum método que um deles tenha e outro não, como o sendKeys do WebElement ou o waitTextNotInElement do Element.

Pode ser que eu esteja com essa necessidade por algum desconhecimento, se for o caso, por favor, podem deixar comentários abaixo, se possível, mas de qualquer forma, por ora esses métodos têm me auxiliado ao escrever as histórias e frases do DBehave para os meus projetos:

/**
 * Retorna um locator com seus valores de parâmetros.
 * 
 * @author Julian Cesar
 * @param locator
 *            O locator do objeto mapeado, ex:
 *            "//div[contains(@class, '%param1%')]//button[contains(@id, '%param2%')]"
 *            (Importante, todos têm que se manter neste padrão "%param" + n
 *            (sequencial de 1 a 9) + "%")
 * @param stringLocParam
 *            A lista de valores a serem substituídos nas variáveis
 *            %param1%, %param2%, etc. ex: ["formulario", "botao_confirmar"]
 * @return novo locator onde os valores dos parâmetros já foram
 *         substituídos, como no exemplo:
 *         "//div[contains(@class, 'formulario')]//button[contains(@id, 'botao_confirmar')]"
 */
public String getLocatorWithParameters(String locator,
		List<String> stringLocParam) {
	if (stringLocParam != null && !stringLocParam.isEmpty()
			&& locator.matches(".*%param[0-9]+%.*")) {
		int n = 1;
		for (String parameter : stringLocParam) {
			String tag = "%param" + n + "%";
			if (locator.contains(tag)) {
				locator = locator.replace(tag, parameter);
			}
			n++;
		}
	}
	return locator;
}

/**
 * Retorna um objeto WebElement (do Selenium) a partir de um objeto Element
 * (do DBehave).
 * 
 * @author 28519192882
 * @param element
 *            O objeto Element do framework Demoiselle Behave.
 * @return Referência ao objeto WebElement (Classe do DBehave) que
 *         representa o elemento que foi renderizado na tela.
 */
public WebElement getWebElement(Element element) {

	return getWebElement(element.getElementMap().name(),
			Arrays.asList(element.getElementMap().locator()), "");

}

/**
 * Retorna um objeto Element (do DBehave) a partir do mapeamento de tela
 * contido no PageObject.
 * 
 * @author 28519192882
 * @param mappedElementName
 *            O nome do elemento mapeado no PageObject.
 * @param locatorParameters
 *            Lista de parâmetros a ser usado nas tags '%param1%',
 *            '%param2%', etc, do elemento mapeado no PageObject.
 * @return Referência ao Element (Classe do DBehave) que representa o
 *         elemento que foi renderizado na tela.
 */
public Element getElement(String mappedElementName,
		List<String> locatorParameters) {

	locatorParameters = DataProviderUtil
			.replaceDataProvider(locatorParameters);
	Element element = runner.getElement(currentPageName, mappedElementName);
	element.setLocatorParameters(locatorParameters);

	return element;

}

/**
 * * Retorna um objeto WebElement (do Selenium) a partir do mapeamento de
 * tela contido no PageObject.
 * 
 * @author 28519192882
 * @param mappedElementName
 *            O nome do elemento mapeado no PageObject.
 * @param locatorParameters
 *            Lista de parâmetros a ser usado nas tags '%param1%',
 *            '%param2%', etc, do elemento mapeado no PageObject.
 * @param additionalRelativeXPath
 *            - XPath adicional relativo ao XPath original do elemento
 *            mapeado em mappedElementName.
 * @return Referência ao WebElement (Classe do Selenium) que representa o
 *         elemento que foi renderizado na tela.
 */
public WebElement getWebElement(String mappedElementName,
		List<String> locatorParameters, String additionalRelativeXPath) {

	if (additionalRelativeXPath == null) {
		additionalRelativeXPath = "";
	}

	Element mappedElement = runner.getElement(currentPageName,
			mappedElementName);

	// recupera os valores definidos na classe Test
	// Se: dataProvider.put("Código", "5945");
	// Ex.: O valor "Código" é subistituído por "5945" no locatorParameters
	List<String> valoresRecuperadosDoDataProvider = DataProviderUtil
			.replaceDataProvider(locatorParameters);

	// Substitui os '%param1%', '%param2%', etc, do elemento mapeado no
	// PageObject, pelos valores passados via locatorParameters.
	String elementLocator = getLocatorWithParameters(mappedElement
			.getElementMap().locator()[0].toString()
			+ additionalRelativeXPath, valoresRecuperadosDoDataProvider);

	By by = ByConverter.convert(
			mappedElement.getElementMap().locatorType(), elementLocator);

	WebElement foundWebElement = null;

	if (webDriver == null) {
		webDriver = (WebDriver) runner.getDriver();
	}

	try {
		foundWebElement = webDriver.findElement(by);
	} catch (NoSuchElementException noSuchElementException) {
		String textoExcecao = "Erro ao localizar elemento \""
				+ mappedElementName + "\"";
		if (!additionalRelativeXPath.equals("")) {
			textoExcecao = textoExcecao
					+ " (com 'additionalRelativeXPath' = \""
					+ additionalRelativeXPath + "\")";
		}
		throw new BehaveException(textoExcecao);
	}

	return foundWebElement;

}

/**
 ** Retorna uma lista de objetos WebElement (do Selenium) a partir do
 * mapeamento de tela contido no PageObject.
 * 
 * @author 28519192882
 * @param mappedElementName
 *            O nome do elemento mapeado no PageObject.
 * @param locatorParameters
 *            Lista de parâmetros a ser usado nas tags '%param1%',
 *            '%param2%', etc, do elemento mapeado no PageObject.
 * @return Referência a uma lista de WebElements (Classe do Selenium) que
 *         representa os elementos que foram renderizados na tela.
 */
public List<WebElement> getWebElementList(String mappedElementName,
		List<String> locatorParameters, String additionalRelativeXPath) {

	if (additionalRelativeXPath == null) {
		additionalRelativeXPath = "";
	}

	Element mappedElement = runner.getElement(currentPageName,
			mappedElementName);

	// recupera os valores definidos na classe Test
	// Se: dataProvider.put("Código", "5945");
	// Ex.: O valor "Código" é subistituído por "5945" no locatorParameters
	List<String> valoresRecuperadosDoDataProvider = DataProviderUtil
			.replaceDataProvider(locatorParameters);

	// Substitui os '%param1%', '%param2%', etc, do elemento mapeado no
	// PageObject, pelos valores passados via locatorParameters.
	String elementLocator = getLocatorWithParameters(mappedElement
			.getElementMap().locator()[0].toString()
			+ additionalRelativeXPath, valoresRecuperadosDoDataProvider);

	By by = ByConverter.convert(
			mappedElement.getElementMap().locatorType(), elementLocator);

	List<WebElement> listOfFoundWebElements = null;

	if (webDriver == null) {
		webDriver = (WebDriver) runner.getDriver();
	}

	try {
		listOfFoundWebElements = webDriver.findElements(by);
	} catch (NoSuchElementException noSuchElementException) {
		String textoExcecao = "Erro ao localizar elemento \""
				+ mappedElementName + "\"";
		throw new BehaveException(textoExcecao);
	}

	return listOfFoundWebElements;

}