-
Notifications
You must be signed in to change notification settings - Fork 53
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;
}