开发者

Can WatiN handle the CuteWebUI Uploader popup dialog?

My Background:

I am new to WatiN, but not new to writing automated Web UI tests. At my new job, we are trying to use WatiN for our Web UI tests (thanks to a few CUIT fails).

I've solved this problem in the past using ArtOfTest.WebAii, by using a Win32 mouse click with a magic number offset from the containing element, but I can't seem to find documentation on how to do that in WatiN and I can't figure it out myself :\

My problem:

This dialog appears and I can't seem to find a way for WatiN to click it.

Can WatiN handle the CuteWebUI Uploader popup dialog?

The dialog has the following markup:

<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="" <=""/>

my test code:

[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
        //开发者_JAVA技巧 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);
    }
}

Any and all help will be very much appreciated.

Thanks!


Your control is a silverlight component which can't be automated with WatiN. Fortunately this you can combine WatiN and White to get the job done.

Following code is created and published by Leo Bartnik so ALL the credits go to him! Have a look at his blog post here. The following code in the comments:

He used the following versions.

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

  • white 0.20 Binaries http://white.codeplex.com/releases/view/29694

    public void WatiN_and_White_join_forces() { // Navigate to your webpage with WatiN string url = "http://localhost[port#]/WatinWhiteTestLandingPage.aspx"; WatiN.Core.IE watin = new WatiN.Core.IE(url); watin.Link(Find.ByText("click here)).Click();

    // 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();
    

    }

btw don't know why the formating of this code is so way off....


So this was my hack solution: Use Microsoft's Coded UI Test to click on the Silverlight dialog. However, CUIT is inferior to WatiN, so I run my test in WatiN and load CUIT for one, magical, click.

Additionally, I was not able to easily find the Silverlight object using CUIT, so I find the window behind it, find the window's center pixel and force a Microsoft.VisualStudio.TestTools.UITesting.Mouse.Click(). Yes, a hack inside of a hack, I am a very bad person, but I ran out of time and just needed something working.

If anyone has a more elegant solution, please share.

My solution code:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜