2014-12-16 3 views
3

Я использую комбинацию SpecFlow, MSTests для модульного тестирования и WatiN для управления браузером для тестирования нашего веб-приложения.Как найти оповещение JavaScript, которое уже открыто с WatiN

  • Visual Studio 2010
  • проект класса стиль Библиотека
  • SpecFlow
  • MS Test
  • WatiN

Если пользователь отправляет наши формы без заполнения всех необходимых полей а JavaScript alert всплывает. Я пытаюсь обнаружить это всплывающее окно с помощью WatiN. Шаг SpecFlow, который запускает предупреждение, отличается от шага SpecFlow, который утверждает, что всплывающее окно существует, поэтому ожидание обработчика диалога WatiN не работает, так как предупреждение уже открыто.

Пример SpecFlow Сценарий:

Scenario: Form Fields are required 
    # This step spawns the alert dialog 
    When I click the "Save and Continue" button 
    # Test fails here because the alert is already open 
    Then I should see the validation error alert 

Определение шага для When I click the "Save and Continue" button

[When(@"I click the ""(.*)"" button")] 
public void WhenIClickTheButton(string buttonText) 
{ 
    Button button = BitWeb.Browser.Button(Find.ByValue(buttonText).Or(Find.ByText(buttonText))); 
    Assert.IsTrue(button.Exists, "No button with text '{0}' was found", buttonText); 
    button.Click(); 
    browser.WaitForComplete(); 
} 

Определение шага для Then I should see the ... alert:

[Then(@"I should see the validation error alert")] 
public void ThenIShouldSeeTheValidationErrorAlert() 
{ 
    var alert = new WatiN.Core.DialogHandlers.AlertDialogHandler(); 

    alert.WaitUntilExists(); 

    StringAssert.Contains(alert.Message, "An error has occurred. Check entire", "The validation error alert was not visible."); 
} 

Вызова alert.WaitUntilExists(); генерирует исключение:

WatiN.Core.Exceptions.WatiNException: Диалог недоступен в течение 30 секунд.

К тому времени, когда я утверждаю, что диалоговое окно оповещения видимо, DialogHandler не находит предупреждение, поскольку оно уже открыто.

Как найти диалоговое окно предупреждения, которое уже открыто с помощью WatiN?

Update # 1: Я склоняюсь к решению, которое использует ScenarioContext.Current объект, я просто не знаю, как подключить все вместе, чтобы браузер не ждать в течение 30 секунд каждый раз, когда он нажимает на кнопку просто чтобы увидеть, появляется ли окно предупреждения.

Обновление № 2: После некоторого исследования нажатие кнопки на одном шаге заставляет весь тестовый фрейм паузы до тех пор, пока диалог alert не будет удален. Щелчок по кнопке «ОК» отклонил диалоговое окно, которое позволило победителю теста перейти к следующему шагу, на котором я утверждаю, что диалоговое окно видно - сценарий с курицей или яйцом. Вызов button.ClickNoWait() исправил проблему.

+0

Почему downvote? –

+0

Диалог html-диалог (тип jquery) или это фактическое всплывающее диалоговое окно (win32)? – ProgrammerV5

+0

Это диалоговое окно 'alert (" message ")'. –

ответ

1

Позвольте мне написать более полный пример этого для вас:

public partial class Form1 : Form 
{ 
    // 
    // Your class properites/variables 
    // 
    AlertDialogHandler dialogHandler; 


    [DllImport("User32.dll")] 
    public static extern Int32 FindWindow(String lpClassName, String lpWindowName); 

    // 
    // Some methods/functions declarations 
    // 

    public void SomeInitMethod() 
    { 
      dialogHandler = new AlertDialogHandler() 
      browse.AddDialogHandler(dialogHandler); 
    } 

    public void SampleMethod() 
    { 
     IntPtr hwndTmp = (IntPtr)FindWindow("#32770", "Dialog Title"); 
     WatiN.Core.Native.Windows.Window popUpDialog = new Window(hwndTmp); 
     dialogHandler.HandleDialog(popUpDialog); 
     // 
     // The line above will find the OK button for you and click on it, 
     // from here you continue with the rest of your code. 

    } 

} 

Надежда это немного, но более ясно.

+0

Хорошо. Это имеет смысл. Я сделал немного больше Googling и придумал это также. Я все еще играю, пытаясь получить ручку в окне предупреждения. Это в основном потому, что я стучу головой против комбо WatiN и SpecFlow. –

+0

Спасибо за помощь, @ ProgrammerV5. +1 и отмечая это как ответ. Я собираюсь добавить свой ответ (не отмеченный как ответ), дающий фактический код C#, который я использовал в отношении SpecFlow для будущей ссылки. –

0

Поскольку это диалоговое окно Win32, вы можете получить дескриптор всплывающего окна (вы знаете стиль и знаете название окна, если вы не знаете стиль, который вы можете узнать с помощью WinSpy ++, просто откройте инструмент и указать на глаза быков на предупреждение, и это даст вам все детали для этого окна)

// #32770 is the window style, just to make the search more confined. 
IntPtr hwndTmp = (IntPtr)FindWindow("#32770", "This should be the title of the alert"); 
Window alertDialog = new Window(hwndTmp); 

здесь на вас будет в состоянии рассматривать как обычный диалог в WatiN (вы должны использовать HandleDialog передавая alertDialog как параметр и т. д., если не ясно, дайте мне знать, и я усилю ответ).

+0

Что такое 'FindWindow'? Где объявлен этот метод? –

+0

Кроме того, в каком пространстве имен/сборке существует класс 'Window'? –

+0

[DllImport ("User32.dll")] public static extern Int32 FindWindow (String lpClassName, String lpWindowName); – ProgrammerV5

0

Я отметил ответ @ ProgrammerV5 как реальный ответ, так как он привел меня к этому коду. Я только отправляю этот ответ, потому что он напрямую относится к SpecFlow и WatiN.

У меня было три разных шага SpecFlow, которые нажали кнопку, которая породила alert, утверждают, что в окне предупреждения есть текст, который я ожидал, и, наконец, последний шаг, чтобы нажать «ОК».

Пример SpecFlow сценарий

Scenario: Doing something really important 
    When I click the "Save and Continue" button 
    Then I should see the validation error alert 
    When I click OK in the validation error alert 
    Then I continue on with the rest of this Scenario... 

Во-первых, я создал метод быстрого помощника, чтобы найти диалог alert:

TestProject/Помощники/StepHelper.cs

public static class StepHelper 
{ 
    [DllImport("User32.dll")] 
    public static extern Int32 FindWindow(String lpClassName, String lpWindowName); 

    public static WatiN.Core.Native.Windows.Window GetAlertBox() 
    { 
     IntPtr hwndTmp = (IntPtr)FindWindow("#32770", "Message from webpage"); 
     return new WatiN.Core.Native.Windows.Window(hwndTmp); 
    } 
} 

Это позволяет вам захватить alert окно в Internet Explorer 8

Screenshot of an alert box in Internet Explorer 8

определения Шаг за When I click the "Save and Continue" button:

[When(@"I click the ""(.*)"" button")] 
public void WhenIClickTheButton(string buttonText) 
{ 
    Button button = browser.Button(Find.ByValue(buttonText).Or(Find.ByText(buttonText))); 
    Assert.IsTrue(button.Exists, "No button with text '{0}' was found", buttonText); 
    button.ClickNoWait(); 
} 

Вызов button.Click() или button.ClickNoWait() является то, что порождает окно предупреждения. Просто вызов метода Click() заставит WatiN дождаться завершения этого события до его возвращения из вызова метода. Так как окно предупреждения было открыто и блокировало страницу, событие клика не завершилось, что вызвало полное завершение вызова Click(). Я обошел это, позвонив ClickNoWait(), который является «огнем и забыть», чтобы щелкнуть элемент на странице. Теперь появляется окно предупреждения, но тестовый бегун может перейти к следующему шагу SpecFlow.

определение Шаг за Then I should see the validation error alert:

[Then(@"I should see the validation error alert")] 
public void ThenIShouldSeeTheValidationErrorAlert() 
{ 
    var alert = StepHelper.GetAlertBox(); 

    Assert.IsTrue(alert.Message.Contains("An error has occurred"), 
     "An alert was found, but contained the wrong message ('{0}')", alert.Message); 
} 

Здесь я использую метод StepHelper.GetAlertBox() я создал ранее, чтобы получить ручку на WatiN.Core.Native.Windows.Window объект, представляющий окно предупреждения. Тогда это просто Assert.IsTrue, гарантируя, что сообщение, отображаемое в предупреждении, на самом деле является нашим сообщением «Ошибка проверки» (у нас есть и другие предупреждения на этой странице).

Наконец, нам необходимо закрыть окно предупреждения.

определение Шаг за When I click OK in the validation error alert:

[When(@"I click OK in the validation error alert")] 
public void WhenIClickOKInTheValidationErrorAlert() 
{ 
    var alert = StepHelper.GetAlertBox(); 

    Assert.IsTrue(alert.Message.Contains("An error has occurred"), 
     "An alert was found, but contained the wrong message ('{0}')", alert.Message); 

    alert.ForceClose(); 
} 

Здесь мы просто получить объект окна оповещения от помощника, и вызвать ForceClose, чтобы закрыть окно предупреждения, так как нажав кнопку «OK» или кнопку «X» в верхнем правом, по существу, делает то же самое.

Смежные вопросы