Skip to content

Busca por texto na página ignorando diferenças entre maiúsculas e minúsculas

ThiagoNicolielo edited this page Mar 14, 2017 · 9 revisions

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!!!