2011-02-16 60 views
0

我的背景:
我是WatiN的新手,但對編寫自動化Web UI測試並不陌生。在我的新工作中,我們嘗試使用WatiN進行Web UI測試(由於少數CUIT失敗)。Can WatiN可以處理CuteWebUI Uploader彈出對話框嗎?

我在過去使用ArtOfTest.WebAii解決了這個問題,通過使用Win32鼠標單擊包含元素的幻數偏移量,但我似乎無法找到關於如何在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); 
    } 
} 

任何及所有的幫助將是非常讚賞。

謝謝!

回答

0

您的控件是Silverlight組件,它不能用WatiN自動執行。幸運的是,您可以將WatiN和White結合起來完成工作。

以下代碼由Leo Bartnik創建併發布,所以所有學分都發給他!看看他的博客文章here。以下代碼在評論中:

他使用了以下版本。

  • 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(){ 到 與華廷網頁//導航 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(); 
    

    }

順便說一句不知道爲什麼這段代碼的格式化是那麼遙遠。 ...

+0

感謝您的答覆,吉榮!我想遠離將另一個框架引入我的代碼庫 - 特別是在0.2版本中。 WatiN有什麼方法可以在指定的像素點模擬鼠標點擊? – GraehamF 2011-02-17 16:40:07

0

所以這是我的黑客解決方案: 使用微軟的Coded UI Test來點擊Silverlight對話框,但是CUIT不如WatiN,所以我在WatiN運行我的測試並加載了一個神奇的,點擊。

此外,我無法使用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! ============================ 
     }