2011-09-21 12 views
10

मैं आईई 9 के खिलाफ वाटिन 2.1.0 के साथ फ़ाइल डाउनलोड का परीक्षण करने की कोशिश कर रहा हूं। मैं, सवाल Downloading a file with Watin in IE9 को स्वीकार कर लिया जवाब से सुझाव कोड का इस्तेमाल किया इस तरह:वाटिन/आईई 9 के साथ फ़ाइल डाउनलोड का परीक्षण कैसे करें?

var downloadHandler = new FileDownloadHandler(fname); 
WebBrowser.Current.AddDialogHandler(downloadHandler); 
link.ClickNoWait(); 
downloadHandler.WaitUntilFileDownloadDialogIsHandled(15); 
downloadHandler.WaitUntilDownloadCompleted(200); 

हालांकि, downloadHandler.WaitUntilFileDownloadDialogIsHandled(15) कॉल का समय समाप्त। मुझे क्या करना चाहिए?

+0

लंबे समय तक प्रतीक्षा करने का प्रयास करें? एक बड़ी फ़ाइल के लिए, फ़ाइल डाउनलोड संवाद में कुछ समय लग सकता है। 15 सेकंड लंबे समय तक पर्याप्त नहीं दिखते –

+0

@ जेरेमी मैक्गी फ़ाइल बहुत छोटी है, और मैंने सत्यापित किया है कि डाउनलोड संवाद दिखाई देता है। मैंने इसे मैन्युअल रूप से भी रद्द कर दिया है, और WaitUntilFileDownloadDialogIsHandled अभी भी समय समाप्त हो गया है। – aknuds1

+0

डायलॉग हैंडलर हेल्पर का उपयोग करने की कोशिश करें ताकि यह पता चल सके कि WATIN वास्तव में आईई 9 डाउनलोड संवाद विंडो क्या सोचता है, क्योंकि यह मुझे लगता है कि आईई 9 की डाउनलोड वार्तालाप माइटिन मांसपेशियों को मांस नहीं खा रहा है। –

उत्तर

8

IE9 अब फ़ाइलों को सहेजने के लिए एक संवाद विंडो का उपयोग नहीं करता है। इसके बजाय, यह वेब साइट से फोकस को रोकने से रोकने के लिए अधिसूचना बार का उपयोग करता है। संदर्भ के लिए "डाउनलोड प्रबंधक" के तहत http://msdn.microsoft.com/en-us/ie/ff959805.aspx देखें।

दुर्भाग्य से, इसका मतलब है कि WATN में वर्तमान फ़ाइलडाउनलोड हैंडलर काम नहीं करेगा। यह प्रति ब्राउज़र उदाहरण के लिए एक "संवादवॉचर" कक्षा को तुरंत चालू करता है जो किसी भी प्रकार की बाल विंडो के लिए एक मूल संदेश पंप है। जब बच्चे की खिड़कियां सामने आती हैं, तो डायलॉग वाटर यह देखने के लिए जांच करता है कि खिड़की विशेष रूप से एक संवाद है (जो अधिसूचना बार नहीं है)। यदि यह एक संवाद है, तो यह "CanHandleDialog" नामक पंजीकृत IDialogHandler उदाहरणों पर फिर से शुरू होता है। भले ही अधिसूचना बार एक संवाद था, यह एक अलग विंडो शैली (http://msdn.microsoft.com/en-us/library/windows/desktop/ms632600(v=vs.85).aspx) है, वैसे ही WATN संवाद के प्रकार का पता लगाता है।

जो मैं देख सकता हूं, आईई 9 अधिसूचना बार और WatiN में इसके संकेतों का पता लगाने के लिए अभी तक कोई समर्थन नहीं है। जब तक वह समर्थन जोड़ा नहीं जाता है, तब तक आप IE9 में फ़ाइलों को डाउनलोड करने में सक्षम नहीं होंगे।

+1

अरग, आप शायद सही हैं हालांकि मैं अन्यथा पुष्टि करने में सक्षम नहीं हूं। – aknuds1

+1

केवल 2.1 का उपयोग करना संभव नहीं है, लेकिन UIAutomation * के बारे में नीचे दी गई विधि का उपयोग करके, सभी पीले-सफेद-बार आदेशों को निष्पादित करना संभव है, जिनमें खुले और सेव-इन शामिल हैं। – tomsv

21

फ़ाइल डाउनलोड संवाद IE9 (Windows7) NetFramework 4.0 में काम नहीं करता है।

सबसे पहले आप अपने परीक्षण परियोजना के लिए संदर्भ UIAutomationClient और UIAutomationTypes जोड़ना होगा:

निम्नलिखित कोड का टुकड़ा आपकी समस्याओं का निवारण हो सकता है।

आईई 9 टूल्स के बाद -> डाउनलोड देखें -> विकल्प आपके सहेजे गए फ़ोल्डर में पथ परिभाषित करते हैं।

अगली विधि ब्राउज़र वर्ग

public static void DownloadIEFile(this Browser browser) 
{ 
    // see information here (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633515(v=vs.85).aspx) 
    Window windowMain = new Window(WatiN.Core.Native.Windows.NativeMethods.GetWindow(browser.hWnd, 5)); 
    System.Windows.Automation.TreeWalker trw = new System.Windows.Automation.TreeWalker(System.Windows.Automation.Condition.TrueCondition); 
    System.Windows.Automation.AutomationElement mainWindow = trw.GetParent(System.Windows.Automation.AutomationElement.FromHandle(browser.hWnd)); 

    Window windowDialog = new Window(WatiN.Core.Native.Windows.NativeMethods.GetWindow(windowMain.Hwnd, 5)); 
    // if doesn't work try to increase sleep interval or write your own waitUntill method 
    Thread.Sleep(1000); 
    windowDialog.SetActivate(); 
    System.Windows.Automation.AutomationElementCollection amc = System.Windows.Automation.AutomationElement.FromHandle(windowDialog.Hwnd).FindAll(System.Windows.Automation.TreeScope.Children, System.Windows.Automation.Condition.TrueCondition); 

    foreach (System.Windows.Automation.AutomationElement element in amc) 
    { 
     // You can use "Save ", "Open", ''Cancel', or "Close" to find necessary button Or write your own enum 
     if (element.Current.Name.Equals("Save")) 
     { 
      // if doesn't work try to increase sleep interval or write your own waitUntil method 
      // WaitUntilButtonExsist(element,100); 
      Thread.Sleep(1000); 
      System.Windows.Automation.AutomationPattern[] pats = element.GetSupportedPatterns(); 
      // replace this foreach if you need 'Save as' with code bellow 
      foreach (System.Windows.Automation.AutomationPattern pat in pats) 
      { 
       // '10000' button click event id 
       if (pat.Id == 10000) 
       { 
        System.Windows.Automation.InvokePattern click = (System.Windows.Automation.InvokePattern)element.GetCurrentPattern(pat); 
        click.Invoke(); 
       } 
      } 
     } 
    } 
} 

फैली अगर आप 'इस रूप में सहेजें' पर क्लिक करें इस

System.Windows.Automation.AutomationElementCollection bmc = element.FindAll(System.Windows.Automation.TreeScope.Children, System.Windows.Automation.Automation.ControlViewCondition); 
System.Windows.Automation.InvokePattern click1 = (System.Windows.Automation.InvokePattern)bmc[0].GetCurrentPattern(System.Windows.Automation.AutomationPattern.LookupById(10000)); 
click1.Invoke(); 
Thread.Sleep(10000); 

System.Windows.Automation.AutomationElementCollection main = mainWindow.FindAll(System.Windows.Automation.TreeScope.Children 
,System.Windows.Automation.Condition.TrueCondition); 
foreach (System.Windows.Automation.AutomationElement el in main) 
{ 
    if (el.Current.LocalizedControlType == "menu") 
    { 
     // first array element 'Save', second array element 'Save as', third second array element 'Save and open' 
     System.Windows.Automation.InvokePattern clickMenu = (System.Windows.Automation.InvokePattern) 
        el.FindAll(System.Windows.Automation.TreeScope.Children,  System.Windows.Automation.Condition.TrueCondition) [1].GetCurrentPattern(System.Windows.Automation.AutomationPattern.LookupById(10000)); 
         clickMenu.Invoke(); 
     //add ControlSaveDialog(mainWindow, filename) here if needed 
     break; 

    } 
} 

संपादित साथ foreach कोड के स्थान पर हैं: यदि आप संवाद के रूप में सहेजने को स्वचालित करने की जरूरत है इसके अलावा पथ निर्दिष्ट करना और सहेजने पर क्लिक करना आप ब्रेक से पहले इस कोड को जोड़कर कर सकते हैं;

private static void ControlSaveDialog(System.Windows.Automation.AutomationElement mainWindow, string path) 
{ 
    //obtain the save as dialog 
    var saveAsDialog = mainWindow 
         .FindFirst(TreeScope.Descendants, 
            new PropertyCondition(AutomationElement.NameProperty, "Save As")); 
    //get the file name box 
    var saveAsText = saveAsDialog 
      .FindFirst(TreeScope.Descendants, 
         new AndCondition(
          new PropertyCondition(AutomationElement.NameProperty, "File name:"), 
          new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit))) 
      .GetCurrentPattern(ValuePattern.Pattern) as ValuePattern; 
    //fill the filename box 
    saveAsText.SetValue(path); 

    Thread.Sleep(1000); 
    //find the save button 
    var saveButton = 
      saveAsDialog.FindFirst(TreeScope.Descendants, 
      new AndCondition(
       new PropertyCondition(AutomationElement.NameProperty, "Save"), 
       new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button))); 
    //invoke the button 
    var pattern = saveButton.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern; 
    pattern.Invoke(); 
} 
+0

यह वास्तव में अच्छा है लेकिन क्या एक विशिष्ट फ़ाइल नाम के रूप में सहेजने के लिए संवाद को स्वचालित रूप से सहेज सकते हैं? मैंने कोड को संशोधित करने का प्रयास किया है, लेकिन जब मैं सहेजने वाले संवाद को खोजने का प्रयास करता हूं तो मुझे परेशानी हो रही है। – PeteT

+1

पथ को सहेजने और सहेजने पर क्लिक करने के लिए काम किया, इसलिए कोड को आपके उत्तर में जोड़ा गया। उम्मीद है कि ठीक है। – PeteT

+2

क्या आप सेव के रूप में पूरे समाधान का एक जिथब गिस्ट पोस्ट कर सकते हैं? मुझे आईई 10 में काम करने में मुश्किल हो रही है। – djbyter

संबंधित मुद्दे