Может WatiN обрабатывать всплывающее диалоговое окно CuteWebUI Uploader? - PullRequest
0 голосов
/ 16 февраля 2011

Мой фон: Я новичок в WatiN, но не новичок в написании автоматических тестов веб-интерфейса.На моей новой работе мы пытаемся использовать WatiN для наших тестов веб-интерфейса (благодаря нескольким сбоям CUIT).

Я решил эту проблему в прошлом, используя ArtOfTest.WebAii, используя мышь Win32щелкните со смещением магического числа от содержащего элемента, но я не могу найти документацию о том, как это сделать в WatiN, и сам не могу понять это: \

Моя проблема:Это диалоговое окно появляется, и я не могу найти способ, чтобы WatiN щелкнул по нему.

enter image description here

В диалоговом окне имеется следующая разметка:

<OBJECT style="FILTER: alpha(opacity=1); WIDTH: 329px; HEIGHT: 100px; mozOpacity: 0.01; opacity: 0.01; mozopacity: 0.01" data="data:application/x-oleobject;base64, <a bunch of data>" width=329 height=100 type=application/x-silverlight-2></OBJECT>  
    <param name="source" value="/CuteWebUI_Uploader_Resource.axd?type=file&file=silverlight.xap&_ver=634334311861475176"/>
    <param name="windowless" value="true" object="" <=""/>

мой тестовый код:

[TestMethod]
public void SomeTest()
{
    Settings.MakeNewIeInstanceVisible = true;
    Settings.AutoStartDialogWatcher = true;
    Settings.AutoMoveMousePointerToTopLeft = false;
    using (IE ie2 = new IE())
    {
        ie2.GoTo(URL);
        ie2.Link(SomeButtonID).Click();
        ie2.Image(AnotherButtonID).FireEvent("onclick");


        // some debugging code wrapped around the next user action
        // which is clicking on the attach file button
        var helper = new DialogHandlerHelper();
        using (new UseDialogOnce(ie2.DialogWatcher, helper))
        {
            Thread.Sleep(1 * 1000); // wait for attach button to be "ready"

            // Click button that triggers the dialog that states:
            //     "file browsing dialog has been blocked"
            //     "please click here and try again"
            //
            ie2.Button(FileAttachButtonID).FireEvent("onclick"); 
        }
        foreach(string dialogHandler in helper.CandidateDialogHandlers)
        {
            // nothing prints out here :(
            Console.Out.WriteLine(dialogHandler);
        }


        // debug print out all elements with tagname = object
        foreach (Element objectElement in ie2.ElementsWithTag("object"))
        {
            StringBuilder elementInfo = new StringBuilder();
            elementInfo.AppendLine("--------------------------------------------");
            elementInfo.AppendLine("element.tagname = " + objectElement.TagName);
            elementInfo.AppendLine("element.style = " + objectElement.Style);
            elementInfo.AppendLine("element.type = " + objectElement.GetAttributeValue("type"));
            elementInfo.AppendLine("element.data = " + objectElement.GetAttributeValue("data"));
            elementInfo.AppendLine("--------------------------------------------");
            Console.Out.WriteLine(elementInfo.ToString());

            // none of these clicks make the dialog go away
            objectElement.ClickNoWait();
            objectElement.Click();
            objectElement.DoubleClick();
            objectElement.MouseEnter();
            objectElement.MouseDown();
            Thread.Sleep(500);
            objectElement.MouseUp();
        }

        // wait to see if dialog disappears after click
        Thread.Sleep(300 * 1000);
    }
}

Любая помощь будет очень признательна.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 февраля 2011

Итак, это было мое решение для взлома: используйте Microsoft Coded UI Test, чтобы перейти в диалог Silverlight.Однако CUIT уступает WatiN, поэтому я запускаю свой тест в WatiN и загружаю CUIT для одного магического щелчка.

Кроме того, мне не удалось легко найти объект Silverlight с помощью CUIT, поэтому я нахожуза ним, найдите центральный пиксель окна и примените Microsoft.VisualStudio.TestTools.UITesting.Mouse.Click ().Да, взломать взлом, я очень плохой человек, но у меня не хватило времени, и мне просто нужно что-то сработать.

Если у кого-то есть более элегантное решение, поделитесь.

Мой код решения:

FileUploadDialogHandler helper = new FileUploadDialogHandler(attachmentPath);
            using (new UseDialogOnce(ie.DialogWatcher, helper))
            {
                Thread.Sleep(1 * 1000); // wait for attach button to be "ready"
                ie.Button(browseButtonID).FireEvent("onclick");


                // When automating a file upload, there is a Silverlight popup in IE that forces an extra click
                // before opening the file open dialog.  WatiN does not support Silverlight automation
                // and the popup element was acting quirky in Microsoft's Coded UI Test, so we find the 
                // dialog box UNDERNEATH the Silverlight popup and force one, lovely, mouse click.
                //===== Entering Coded UI Test land, beware! =====================================

                // initialize Coded UI Test
                Playback.Initialize();
                BrowserWindow.CurrentBrowser = "IE";
                Process watinBrowserProcess = Process.GetProcessById(ie.ProcessID);
                BrowserWindow cuitBrowser = BrowserWindow.FromProcess(watinBrowserProcess); // attach Coded UI Test to the IE browser WatiN initialized

                // get the window underneath the Silverlight popup
                UITestControl modalUnderSilverlightPopup = new UITestControl(cuitBrowser.CurrentDocumentWindow);
                modalUnderSilverlightPopup.SearchProperties.Add("id", windowElementUnderPopupID);

                // get the X and Y pixel center of the window
                int centerX = modalUnderSilverlightPopup.BoundingRectangle.X + modalUnderSilverlightPopup.BoundingRectangle.Width / 2;
                int centerY = modalUnderSilverlightPopup.BoundingRectangle.Y + modalUnderSilverlightPopup.BoundingRectangle.Height / 2;

                // Click!
                Mouse.Click(new Point(centerX, centerY));

                // Shutdown Coded UI Test
                Playback.Cleanup();
                //===== End Coded UI Test land, you survived! yay! ============================
        }
0 голосов
/ 16 февраля 2011

Ваш элемент управления является компонентом Silverlight, который нельзя автоматизировать с помощью WatiN. К счастью, вы можете объединить WatiN и White, чтобы выполнить работу.

Следующий код создан и опубликован Лео Бартником, так что ВСЕ кредиты достаются ему! Посмотрите его пост в блоге здесь . Следующий код в комментариях:

Он использовал следующие версии.

  • watin-2.0.50.1179.zip от 2011-02-08 http://sourceforge.net/projects/watin/files/WatiN%202.x/2.0%20Final/

  • белый 0,20 бинарный файл http://white.codeplex.com/releases/view/29694

    публичный void WatiN_and_White_join_forces () { // Перейдите на свою веб-страницу с WatiN string url = "http://localhost[port #] / WatinWhiteTestLandingPage.aspx"; WatiN.Core.IE watin = new WatiN.Core.IE (url); watin.Link (Find.ByText ("нажмите здесь)). Нажмите ();

    // Attach the IE instance used by WatiN to White
    InternetExplorerFactory.Plugin();
    string title = "[browser title here]"; // will be something like "WatinWhiteHybrid - Internet Explorer provided by ..."
    var ie = (InternetExplorerWindow)Application.Attach(watin.ProcessID).GetWindow(title);
    White.WebBrowser.Silverlight.SilverlightDocument sl = ie.SilverlightDocument;
    
    // Click the button in the silverlight control using White
    sl.Get(SearchCriteria.ByAutomationId("ClickMeId")).Click();
    

    } ​​

Кстати, не знаю, почему форматирование этого кода так далеко ....

...