Pregunta

Tengo un cuadro de mensaje simple en una aplicación WPF que se inicia de la siguiente manera:

private void Button_Click(object sender, RoutedEventArgs e)
{
   MessageBox.Show("Howdy", "Howdy");
}

Puedo obtener blanco para hacer clic en mi botón y abrir el cuadro de mensaje.

UISpy lo muestra como un elemento secundario de mi ventana. No pude encontrar el método para acceder a él.

¿Cómo obtengo acceso a mi MessageBox para verificar su contenido?

¿Fue útil?

Solución

Lo encontré! La clase de ventana tiene un método MessageBox que hace el truco:

        var app = Application.Launch(@"c:\ApplicationPath.exe");
        var window = app.GetWindow("Window1");
        var helloButton = window.Get<Button>("Hello");
        Assert.IsNotNull(helloButton);
        helloButton.Click();
        var messageBox = window.MessageBox("Howdy");
        Assert.IsNotNull(messageBox);

Otros consejos

Intenta esto

       Window messageBox = window.MessageBox("");
       var label = messageBox.Get<Label>(SearchCriteria.Indexed(0));
       Assert.AreEqual("Hello",label.Text);

En el código fuente de White hay algunos proyectos de pruebas de interfaz de usuario (para probar a White).

Una de las pruebas incluye las pruebas MessageBox, que incluyen una forma de obtener el mensaje mostrado.

[TestFixture, WinFormCategory, WPFCategory]
public class MessageBoxTest : ControlsActionTest
{
    [Test]
    public void CloseMessageBoxTest()
    {
        window.Get<Button>("buttonLaunchesMessageBox").Click();
        Window messageBox = window.MessageBox("Close Me");
        var label = window.Get<Label>("65535");
        Assert.AreEqual("Close Me", label.Text);
        messageBox.Close();
    }

    [Test]
    public void ClickButtonOnMessageBox()
    {
        window.Get<Button>("buttonLaunchesMessageBox").Click();
        Window messageBox = window.MessageBox("Close Me");
        messageBox.Get<Button>(SearchCriteria.ByText("OK")).Click();
    }
}

Evidentemente, la etiqueta utilizada para mostrar el mensaje de texto es propiedad de la ventana que muestra el cuadro de mensaje, y su identificación principal es el valor máximo de palabra (65535).

window.MessageBox () es una buena solución !!

Pero este método se quedaría bloqueado durante mucho tiempo si el cuadro de mensaje no aparece . A veces, quiero marcar " No aparece " de un cuadro de mensaje ( Advertencia, Error, etc. ). Así que escribo un método para establecer el timeOut por subprocesos.

[TestMethod]
public void TestMethod()
{
    // arrange
    var app = Application.Launch(@"c:\ApplicationPath.exe");
    var targetWindow = app.GetWindow("Window1");
    Button button = targetWindow.Get<Button>("Button");

    // act
    button.Click();        

    var actual = GetMessageBox(targetWindow, "Application Error", 1000L);

    // assert
    Assert.IsNotNull(actual); // I want to see the messagebox appears.
    // Assert.IsNull(actual); // I don't want to see the messagebox apears.
}

private void GetMessageBox(Window targetWindow, string title, long timeOutInMillisecond)
{
    Window window = null ;

    Thread t = new Thread(delegate()
    {
        window = targetWindow.MessageBox(title);
    });
    t.Start();

    long l = CurrentTimeMillis();
    while (CurrentTimeMillis() - l <= timeOutInMillsecond) { }

    if (window == null)
        t.Abort();

    return window;
}

public static class DateTimeUtil
{
    private static DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    public static long currentTimeMillis()
    {
        return (long)((DateTime.UtcNow - Jan1st1970).TotalMilliseconds);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top