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

Фотография

Проблема с редиректами


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 5

#1 crazybutcher

crazybutcher

    Новый участник

  • Members
  • Pip
  • 12 сообщений

Отправлено 23 июня 2009 - 10:28

Добрый день...
Я только начал учить Selenium.
Решил написать простенький скрипт: Зайти на мыло, проверить входящие.
[codebox]selenium.Open("http://bigmir.net");
selenium.Click("UserEmailStatusImg");
selenium.Type("login", "......");
selenium.Type("pass", ".....");
selenium.Click("subm");
selenium.WaitForPageToLoad("300000");
selenium.SelectFrame("cwlrx3syqxvgf");
selenium.Click("link=Входящие");[/codebox]
Но столкнулся с такой проблемкой как редирект - с "bigmir" на "google", а потом на "mail.google.com"
На сколько я понимаю, то WaitForPageToLoad здесь не катит
Можно ли написать, что-то типа ожидания определенного адреса, потом только продолжить скрипт?
Или еще какие-то варианты...
Спасибо
  • 0

#2 Astashonok

Astashonok

    Новый участник

  • Members
  • Pip
  • 37 сообщений

Отправлено 23 июня 2009 - 10:56

Добрый день...
Я только начал учить Selenium.
Решил написать простенький скрипт: Зайти на мыло, проверить входящие.

selenium.Open("http://bigmir.net");            selenium.Click("UserEmailStatusImg");            selenium.Type("login", "......");            selenium.Type("pass", ".....");            selenium.Click("subm");            selenium.WaitForPageToLoad("300000");           selenium.SelectFrame("cwlrx3syqxvgf");            selenium.Click("link=Входящие");
Но столкнулся с такой проблемкой как редирект - с "bigmir" на "google", а потом на "mail.google.com"
На сколько я понимаю, то WaitForPageToLoad здесь не катит
Можно ли написать, что-то типа ожидания определенного адреса, потом только продолжить скрипт?
Или еще какие-то варианты...
Спасибо



было что-то похожее...
решил отслеживанием title страниц...

selenium.getTitle()

написал функцию, которая ждет 3 секунды и проверяет title, если он такой, как передаваемый параметр, то хватит ждать, иначе ещё подождать... как передаваемый параметр в функцию можно также указать и таймаут (сколько ждать прежде чем выдать таймаут-error)
  • 0
  • Зачем идти в разработчики, когда столько кайфа в тестировании?!

#3 crazybutcher

crazybutcher

    Новый участник

  • Members
  • Pip
  • 12 сообщений

Отправлено 23 июня 2009 - 11:49

А можно плиз по точнее, как это все написать
  • 0

#4 Astashonok

Astashonok

    Новый участник

  • Members
  • Pip
  • 37 сообщений

Отправлено 23 июня 2009 - 12:22

А можно плиз по точнее, как это все написать


ну... что-то вроде этого...
помидорами не кидайтесь... писал навскидку...


public static void waitForTitle(String Title, long MyTimeOut) {boolean NotFound=true;long timeOut=0;do {if(selenium.getTitle().contains(Title)) {System.out.println("Yes"); //вывод это просто для наглядности... потом его надо //закоментарить...NotFound=false;break; }else	{	try {		Thread.sleep(3000);	} catch (InterruptedException e) 		{		e.printStackTrace();		}timeOut+=3000;NotFound=true;	    }	} while (timeOut<MyTimeOut);if(NotFound) System.exit(1);}
использование
waitForTitle("Google", 10000);

P.S. по сути он может ждать не 10 секунд, а 12 (в данном случае), т.к. не каждую секунду происходит проверка, а только раз в три секунды...
  • 0
  • Зачем идти в разработчики, когда столько кайфа в тестировании?!

#5 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 26 июня 2009 - 13:43

Не надо ничего колдовать с циклическими проверками и дополнительными запросами через драйвер, вот:
/**
	 * Waits for element to appear/disappear on page for specified time.
	 *
	 * @param locator an element locator.
	 * @param present if true then waits until element appear, else waits until element disappear.
	 * @param timeout time to wait in milliseconds after which {@link TimeoutException} will be thrown.
	 * @throws TimeoutException  if timeout reached.
	 * @throws SeleniumException in case of some problems in Selenium Server.
	 */
	public void waitForElement(String locator, boolean present, int timeout) throws SeleniumException {
		String logMessage = "Waiting for element '" + locator + "' to " + (present ? "" : "dis") + "appear for " + timeout + " milliseconds... Element ";
		try {
			waitForCondition((present ? "" : "!") + "selenium.isElementPresent('" + locator.replaceAll("'", "\\\\'") + "');", timeout);
		} catch (TimeoutException e) {
			logMessage += "didn't ";
			throw new TimeoutException(logMessage, e);
		} finally {
			logMessage += (present ? "" : "dis") + "appear as expected!";
			LOG.debug(logMessage);
		}
	}

	/**
	 * Same as {@link #waitForElement(String, boolean, int)}, but uses default timeout, which can be set by calling
	 * {@link #setTimeout(int)}.
	 *
	 * @param locator an element locator.
	 * @param present if true then waits until element appear, else waits until element disappear.
	 * @throws TimeoutException  if timeout reached.
	 * @throws SeleniumException in case of some problems in Selenium Server.
	 */
	public void waitForElement(String locator, boolean present) throws SeleniumException {
		waitForElement(locator, present, timeout);
	}

	/**
	 * Same as {@link #waitForElement(String, boolean, int)} with 3rd paramer set to "true".
	 *
	 * @param locator an element locator.
	 * @param timeout time to wait in milliseconds after which {@link TimeoutException} will be thrown.
	 * @throws TimeoutException  if timeout reached.
	 * @throws SeleniumException in case of some problems in Selenium Server.
	 */
	public void waitForElementAppear(String locator, int timeout) throws SeleniumException {
		waitForElement(locator, true, timeout);
	}

	/**
	 * Same as {@link #waitForElementAppear(String, int)}, but uses default timeout, which can be set by calling {@link
	 * #setTimeout(int)}.
	 *
	 * @param locator an element locator.
	 * @throws TimeoutException  if timeout reached.
	 * @throws SeleniumException in case of some problems in Selenium Server.
	 */
	public void waitForElementAppear(String locator) throws SeleniumException {
		waitForElementAppear(locator, timeout);
	}

	/**
	 * Same as {@link #waitForElement(String, boolean, int)} with 3rd paramer set to "false".
	 *
	 * @param locator an element locator.
	 * @param timeout time to wait in milliseconds after which {@link TimeoutException} will be thrown.
	 * @throws TimeoutException  if timeout reached.
	 * @throws SeleniumException in case of some problems in Selenium Server.
	 */
	public void waitForElementDisappear(String locator, int timeout) {
		waitForElement(locator, false, timeout);
	}

	/**
	 * Same as {@link #waitForElementDisappear(String, int)}, but uses default timeout, which can be set by calling
	 * {@link #setTimeout(int)}.
	 *
	 * @param locator an element locator.
	 * @throws TimeoutException  if timeout reached.
	 * @throws SeleniumException in case of some problems in Selenium Server.
	 */
	public void waitForElementDisappear(String locator) throws SeleniumException {
		waitForElementDisappear(locator, timeout);
	}

  • 0

#6 crazybutcher

crazybutcher

    Новый участник

  • Members
  • Pip
  • 12 сообщений

Отправлено 04 февраля 2010 - 13:58

можно еще и так:
[codebox]for (int second = 0;; second++) {
if (second >= 60) Assert.Fail("timeout");
try
{
if ("" == selenium.GetText("")) break;
}
catch (Exception){
Thread.Sleep(500);
}[/codebox]
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных