-
Notifications
You must be signed in to change notification settings - Fork 53
Busca por texto na página ignorando diferenças entre maiúsculas e minúsculas
Eu não costumo precisar buscar textos na página diferenciando maiúsculas de minúsculas, portanto, no meu projeto estou sobreescrevendo a frase "Então será exibido 'texto'" para tornar case insensitive (pois já tive problemas de aparentemente não encontrar textos, mas se tratava da frase ser case sensitive).
Basicamente apenas comparei o texto e o conteúdo utilizando o método toLowerCase() da classe String, e a frase com a annotation @Override acaba sendo utilizada, ao invés da frase padrão do DBehave.
No meu caso atende, e se em algum momento eu precisar de uma comparação case sensitive, posso acessar a original do CommonSteps ou criar uma cópia deste método onde mencione considerar o case, mas não devo precisar neste projeto.
[Prevendo algum possível atraso na performance (mas que não chegou a se manifestar), só verifico o texto passando para lowercase caso não encontre antes sem alterar o case. Já que a maioria dos casos no projeto não ocorrem diferenças de Case, isso deve resolver e minimizar impactos na performance.]
Enfim, no meu MySteps adicionei os dois métodos abaixo:
@Override
@Then("será exibido \"$text\"")
public void textVisible(String text) {
text = DataProviderUtil.replaceValue(text);
waitVisibleText_caseInsensitive(text);
}
/**
* Aguarda um texto ficar visível na página. É importante saber que textos
* que não estão visíveis mas estão no HTML não são considerados. Também não
* são considerados textos que estiverem dentro das tags SCRIPT e STYLE.
*
* @param text
* Texto a ser encontrado.
*/
public void waitVisibleText_caseInsensitive(String text) {
WebDriver driver = (WebDriver) runner.getDriver();
SwitchDriver frame = new SwitchDriver(driver);
final long startedTime = GregorianCalendar.getInstance()
.getTimeInMillis();
boolean found = false;
while (true) {
try {
driver.manage().timeouts()
.implicitlyWait(0, TimeUnit.MILLISECONDS);
// Mesmo que não tenha frame ele pega o "primeiro"
frame.bind();
// Quando tem somente 1 frame
if (frame.countFrames() == 1) {
List<WebElement> elementsFound = driver.findElements(By
.xpath("/html"));
String textHtml = elementsFound.get(0).getText();
log.debug("O tamanho do texto analizado é de ["
+ textHtml.length() + "]");
if (textHtml.contains(text)) {
// log.debug("Encontrou o texto [" + text +
// "] na página");
found = true;
break;
}
} else {
for (int i = 0; i < frame.countFrames(); i++) {
frame.switchNextFrame();
List<WebElement> elementsFound = driver.findElements(By
.xpath("/html"));
if (elementsFound.size() == 1) {
WebElement element = elementsFound.get(0);
String textHtml = element.getText();
log.debug("O tamanho do texto analizado é de ["
+ textHtml.length() + "]");
if (textHtml.contains(text)) {
// log.debug("Encontrou o texto [" + text +
// "] na página utilizando os frames");
found = true;
break;
} else if (textHtml.toLowerCase().contains(
text.toLowerCase())) {
// log.debug("Encontrou o texto [" + text +
// "] na página utilizando os frames");
found = true;
break;
}
}
}
}
if (found) {
break;
}
} catch (BehaveException be) {
log.warn("waitVisibleText BehaveException");
log.warn(be);
} catch (Exception e) {
log.warn("waitVisibleText Exception");
log.warn(e);
} finally {
driver.manage()
.timeouts()
.implicitlyWait(BehaveConfig.getRunner_ScreenMaxWait(),
TimeUnit.MILLISECONDS);
// Controle do timeout manualmente
if (!found
&& (GregorianCalendar.getInstance().getTimeInMillis()
- startedTime > BehaveConfig
.getRunner_ScreenMaxWait())) {
Assert.fail(message.getString("message-text-not-found",
text));
}
}
}
}
Quaisquer dicas ou palpites, por favor, deixem um comentário!!!