【问题标题】:Can WatiN handle the CuteWebUI Uploader popup dialog?WatiN 可以处理 CuteWebUI Uploader 弹出对话框吗?
【发布时间】:2011-02-16 19:37:18
【问题描述】:

我的背景:
我是 WatiN 的新手,但对编写自动化 Web UI 测试并不陌生。在我的新工作中,我们正在尝试使用 WatiN 进行 Web UI 测试(由于一些 CUIT 失败)。

我过去使用 ArtOfTest.WebAii 解决了这个问题,方法是使用 Win32 鼠标单击与包含元素偏移的幻数,但我似乎无法在 WatiN 中找到有关如何执行此操作的文档和我自己想不通:\

我的问题:
出现此对话框,我似乎无法找到让 WatiN 单击它的方法。

对话框具有以下标记:

<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);
    }
}

我们将不胜感激。

谢谢!

【问题讨论】:

    标签: dialog click watin ui-testing


    【解决方案1】:

    您的控件是一个 Silverlight 组件,无法通过 WatiN 实现自动化。幸运的是,您可以将 WatiN 和 White 结合起来完成工作。

    以下代码由 Leo Bartnik 创建和发布,因此所有功劳归他所有!看看他的博文here。 cmets中的以下代码:

    他使用了以下版本。

    • 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

      公共无效WatiN_and_White_join_forces() { // 使用 WatiN 导航到您的网页 字符串 url = "http://localhost[port#]/WatinWhiteTestLandingPage.aspx"; WatiN.Core.IE watiN = new WatiN.Core.IE(url); watin.Link(Find.ByText("点击这里)).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();
      

      }

    顺便说一句,不知道为什么这段代码的格式如此偏离......

    【讨论】:

    • 感谢您的回复,杰伦!我不想在我的代码库中引入另一个框架——尤其是 0.2 版的框架。有没有什么方法可以在指定像素点模拟鼠标点击?
    • 不,WatiN 不支持在指定的像素点上单击鼠标。
    【解决方案2】:

    所以这是我的 hack 解决方案: 使用 Microsoft 的 Coded UI Test 单击 Silverlight 对话框。但是,CUIT 不如 WatiN,所以我在 WatiN 中运行我的测试并加载 CUIT 为一个,神奇,点击。

    此外,我无法使用 CUIT 轻松找到 Silverlight 对象,因此我找到它后面的窗口,找到窗口的中心像素并强制执行 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! ============================
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多