फ़ाइल डाउनलोड संवाद 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();
}
लंबे समय तक प्रतीक्षा करने का प्रयास करें? एक बड़ी फ़ाइल के लिए, फ़ाइल डाउनलोड संवाद में कुछ समय लग सकता है। 15 सेकंड लंबे समय तक पर्याप्त नहीं दिखते –
@ जेरेमी मैक्गी फ़ाइल बहुत छोटी है, और मैंने सत्यापित किया है कि डाउनलोड संवाद दिखाई देता है। मैंने इसे मैन्युअल रूप से भी रद्द कर दिया है, और WaitUntilFileDownloadDialogIsHandled अभी भी समय समाप्त हो गया है। – aknuds1
डायलॉग हैंडलर हेल्पर का उपयोग करने की कोशिश करें ताकि यह पता चल सके कि WATIN वास्तव में आईई 9 डाउनलोड संवाद विंडो क्या सोचता है, क्योंकि यह मुझे लगता है कि आईई 9 की डाउनलोड वार्तालाप माइटिन मांसपेशियों को मांस नहीं खा रहा है। –