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

Фотография

Selenium 2.30/31: падение после закрытия алерта


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

#1 Phelikss

Phelikss

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

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


Отправлено 28 февраля 2013 - 13:15

После выхода Selenium 2.30/31 тесты стали падать после выполнения строчки
assertTrue(closeAlertAndGetItsText(driver).matches("^Do you really want to delete these records[\\s\\S]$"));

появляется NoAlertPresentException

в detailMessage "No JavaScript modal dialog is open (WARNING: The server did not provide any stacktrace information)"

Какая еще информация может помочь?
  • 0

#2 Phelikss

Phelikss

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

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


Отправлено 28 февраля 2013 - 13:45

Если перехватывать исключение становится легче,
try {
assertTrue(closeAlertAndGetItsText(driver).matches("^Do you really want to delete these records[\\s\\S]$"));
} catch (NoAlertPresentException e) {}

но в Selenium 2.29 все работает и исключение не появляется, что изменилось?
  • 0

#3 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 28 февраля 2013 - 19:03

Ага, я понял -- это исправили баг :)
alert.getText() теперь выбрасывает исключение NoAlertPresentException, если alert уже закрыт (раньше так было реализовано только в python и .Net, теперь так же работает в Java и Ruby)
  • 2
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#4 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 28 февраля 2013 - 19:07

Конструктивно, как исправить -- теперь метод должен выглядеть примерно так:

  private String closeAlertAndGetItsText() {
    try {
      Alert alert = driver.switchTo().alert();
      String alertText = alert.getText();
      if (acceptNextAlert) {
        alert.accept();
      } else {
        alert.dismiss();
      }
      return alertText;
    } finally {
      acceptNextAlert = true;
    }
  }

К сожалению, новые релизы Selenium IDE выходят реже, чем релизы WebDriver, поэтому пока код генерируется ошибочный. В следующей версии Selenium IDE это уже будет исправлено.
  • 6
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#5 Phelikss

Phelikss

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

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


Отправлено 01 марта 2013 - 06:52

Спасибо, за быстрое решение проблемы.
  • 0

#6 prostooleg1

prostooleg1

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • Город:Москва


Отправлено 02 марта 2013 - 15:41

Ага, я понял -- это исправили баг :)
alert.getText() теперь выбрасывает исключение NoAlertPresentException, если alert уже закрыт (раньше так было реализовано только в python и .Net, теперь так же работает в Java и Ruby)


Спасибо вам, у меня были методы, которые вначале обрабатывали алерт а потом получали текст и с 2.30 версии тоже такие тесты стали падать.
  • 0

#7 evdubkov

evdubkov

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

  • Members
  • Pip
  • 2 сообщений
  • ФИО:Дубков Евгений

Отправлено 23 июля 2013 - 09:01

а не подскажите как постоить условие, которое проверяет текст в сообщении, и в соответствии с ним нажимает кнопку?


if (driver.getPageSource().contains("Текст 1"))
{try { assertTrue(closeAlertAndGetItsText().matches("Текст 1"));
}catch (NoAlertPresentException e){}
TimeUnit.SECONDS.sleep(3);
}
else { if (driver.getPageSource().contains("Текст 2"))
{try { assertTrue(closeAlertAndGetItsText().matches("Текст 2"));
}catch (NoAlertPresentException e){}
TimeUnit.SECONDS.sleep(3);
}
}
этот метод не работает, какую функцию можно использовать, чтоб проверить текст в сообщении?
  • 0

#8 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 23 июля 2013 - 09:47

а не подскажите как постоить условие, которое проверяет текст в сообщении, и в соответствии с ним нажимает кнопку?
этот метод не работает, какую функцию можно использовать, чтоб проверить текст в сообщении?

Может, попробовать контейн или эквиваил, вместо matches?
  • 0

#9 Petrov.Sergey

Petrov.Sergey

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

  • Members
  • PipPipPipPip
  • 446 сообщений
  • ФИО:Petrov Sergey
  • Город:МО, Лобня


Отправлено 23 июля 2013 - 09:53

а не подскажите как постоить условие, которое проверяет текст в сообщении, и в соответствии с ним нажимает кнопку?


if (driver.getPageSource().contains("Текст 1"))
{try { assertTrue(closeAlertAndGetItsText().matches("Текст 1"));
}catch (NoAlertPresentException e){}
TimeUnit.SECONDS.sleep(3);
}
else { if (driver.getPageSource().contains("Текст 2"))
{try { assertTrue(closeAlertAndGetItsText().matches("Текст 2"));
}catch (NoAlertPresentException e){}
TimeUnit.SECONDS.sleep(3);
}
}
этот метод не работает, какую функцию можно использовать, чтоб проверить текст в сообщении?

Какое обилие фигурных скобок! Да ещё без форматирования! :nea:/> :acute:/>
А если попробовать вот так:
Alert alert = driver.switchTo().alert();
try {
	if (alert.getText().toLowerCase().contains("")) {
		//что надо сделать?
		alert.close();
	} else {
		//что надо сделать?
		alert.close();
	}
} catch (NoAlertPresentException e){
	TimeUnit.SECONDS.sleep(3); // а чего так много?
}

  • 1
Форум читаю набегами. По возникшим вопросам можно в скайп (в профиле).

#10 evdubkov

evdubkov

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

  • Members
  • Pip
  • 2 сообщений
  • ФИО:Дубков Евгений

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

Какое обилие фигурных скобок! Да ещё без форматирования!

Простите, пишу впервые

Alert alert = driver.switchTo().alert();
    try {
            if (alert.getText().toLowerCase().contains("Текст 1")) 
            {
                    
               assertTrue(closeAlertAndGetItsText().matches("Текст 1"));
                    
                   alert.dismiss();
            } 
                else { if (alert.getText().toLowerCase().contains("Текст 2")) 
                
                    { assertTrue(closeAlertAndGetItsText().matches("Текст 2"));
                 
                } alert.dismiss();
            }
          
    }catch (NoAlertPresentException e){}
Работает, спасибо большое)))
  • 0

#11 Petrov.Sergey

Petrov.Sergey

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

  • Members
  • PipPipPipPip
  • 446 сообщений
  • ФИО:Petrov Sergey
  • Город:МО, Лобня


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

Простите, пишу впервые

Alert alert = driver.switchTo().alert();
    try {
            if (alert.getText().toLowerCase().contains("Текст 1")) 
            {
                    
               assertTrue(closeAlertAndGetItsText().matches("Текст 1"));
                    
                   alert.dismiss();
            } 
                else { if (alert.getText().toLowerCase().contains("Текст 2")) 
                
                    { assertTrue(closeAlertAndGetItsText().matches("Текст 2"));
                 
                } alert.dismiss();
            }
          
    }catch (NoAlertPresentException e){}
Работает, спасибо большое)))

Простите, хочу обратить Ваше пристальное внимание на метод ".toLowerCase()".
Есть подозрение, что Ваш код работает всё же не совсем так, как должен был бы.

И опять лишние фигурные скобки усложняют чтение.
1) Зачем Вам "else if" ? Конструкция "else if" подразумевает наличие простого else (что делать, если ни одно из предыдущих условий не сработало?)
2) Может ли алерт содержать другой текст, отличный от "Текст 1" и "Текст 2"?
3) Зачем матчить содержимое алерта по фразе, если условие IF уже пропускает только те алерты, которые содержат необходимую фразу?
  • 0
Форум читаю набегами. По возникшим вопросам можно в скайп (в профиле).


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

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