Перейти к содержимому

vitorg

Регистрация: 01 ноя 2007
Offline Активность: 25 янв 2020 23:35
-----

#61742 WaitForElementPresent

Написано vitorg 14 октября 2008 - 09:53

Не понятно :). Объясните, по возможности, в чём принципиальная порочность подхода? Ибо вездесущие "не рекомендуется" убеждают слабо, а работающий код чуть сильнее. Хотя, с Вашего разрешения, возьму Ваш код на вооружение :).

При использовании класса Wait и т.п. мы файтически в цикле вызываем метод
DefaultSelenium#isElementPresent(String)

Этот вызов приводит к обращению драйвера к SeleniumRC по HTTP-протоколу, вызову команды JS через SeleniumCore самим RC и возврату результата обратно в драйвер. Само собой дело это не быстрое, а когда у нас цикл, то таких цепочек у нас может быть достаточно много, соответственно временное разрешение у нас очень маленькое (количество проверок в единицу времени). Кроме того что это расточительно, у нас может быть достаточно динамичное приложение и элемент мог не только появиться, но и уже исчезнуть, причём несколько раз.

При использовании метода
DefaultSelenium#waitForCondition(String, String)
Происходит единственный запрос от драйвера к SeleniumRC и дальше цикл проверки на появление/исчезновение элемента выполняется только на стороне браузера JavaScript'ом. В этом случае мы имеем временное разрешение примерно того же порядка, что и скорость работы самого тестируемого Web-приложения.

Немного сумбурно, но думаю понятно :)
  • 1


#61704 WaitForElementPresent

Написано vitorg 13 октября 2008 - 18:39

Спасибо за ответ. Указанный код работает, что неудивительно.

Что интересно - в доках говорят о классе Wait (http://release.openq...0.9.2/doc/java/).
Пока что-то не разобралась, но видимо это еще один вариант решения.


Очень не рекомендую использовать в данном случае класс Wait... да и вообще мало где его можно применить в тестах на Selenium.
Тебе необходимо расширить DefaultSelenium и добавить следующий код:

/**
	 * Waiting for element to appear/disappear on page for specified time (means not element visibility but really
	 * present/not present like in {@link com.thoughtworks.selenium.Selenium#isElementPresent(String)} method).
	 *
	 * @param locator an element locator.
	 * @param timeout time to wait in milliseconds after which {@link TimeoutException} will be thrown.
	 * @param present true - wait until element appear, false - wait until element disappear.
	 * @since Selenium RC 0.9.2.
	 */
	public void waitForElement(String locator, String timeout, boolean present) {
		String logMessage = "Waiting for element '" + locator + "' to " + (present ? "" : "dis") + "appear for " + timeout + " milliseconds... Element ";
		try {
			waitForCondition("var element;" +
					"try{" +
					" element = selenium.browserbot.findElement('" + locator.replaceAll("'", "\\\\'") + "');" +
					"} catch(e){" +
					" element = null;" +
					"}" +
					"element" + (present ? "!=" : "==") + "null;", timeout);
			logMessage += (present ? "" : "dis") + "appear.";
		} catch (SeleniumException e) {
			logMessage += "didn't " + (present ? "" : "dis") + "appear as expected!";
			throw new RunTimeException(logMessage, e);
		} finally {
			LOG.trace(logMessage);
		}
	}

	/**
	 * Waiting for element to appear on page for specified time. It's the same as {@link #waitForElement(String, String,
	 * boolean)} when the third parameter is true.
	 *
	 * @param locator an element locator.
	 * @param timeout time to wait in milliseconds after which {@link TimeoutException} will be thrown.
	 * @since SeleniumRC 0.9.2.
	 */
	public void waitForElementAppear(String locator, String timeout) {
		waitForElement(locator, timeout, true);
	}

	/**
	 * Waiting for element to disappear on page for specified time. It's the same as {@link #waitForElement(String,
	 * String, boolean)} when the third parameter is false.
	 *
	 * @param locator an element locator.
	 * @param timeout time to wait in milliseconds after which {@link TimeoutException} will be thrown.
	 * @since SeleniumRC 0.9.2.
	 */
	public void waitForElementDisappear(String locator, String timeout) {
		waitForElement(locator, timeout, false);
	}

Теперь должно быть понятно почему использование класса Wait плохо.

PS: приведённый в 4-м посте код страдает теми же проблемами, что и решение с Wait.
  • 1