Пример #1
0
        /*****************************************************************************
        *  FUNCTION:       ManageDataConnections
        *  Description:
        *  Parameters:     None
        *****************************************************************************/
        private void ManageDataConnections()
        {
            String pUrl = TemplateRequestStr;

            MSHTML.HTMLDocument   htmlresponse = new MSHTML.HTMLDocument();
            MSHTML.IHTMLDocument2 webresponse  = (MSHTML.IHTMLDocument2)htmlresponse;

            if (LockedForUpdate == false)
            {
                LockedForUpdate = true;

                //Disable timer ticks
                LiveSessionTimer.Stop();
                SendMessage(this.ParentFormPtr, WM_UPDATING_DATA, IntPtr.Zero, IntPtr.Zero);

                /**** Download Data ****/
                pUrl += "?noconstruct=1" + "&smlID=" + ActiveMarket.smlId +
                        "&sid=" + ActiveMarket.sid + "&tabletype=price" + "&index_id=" + ActiveMarket.id;

                webresponse = Helpers.HTMLRequestResponse(pUrl);

                //Parse the downloaded HTML file
                if (HistoricalData == null)
                {
                    HistoricalData = new ExchangeMarket();
                }

                HistoricalData.parseHtmlLiveData(webresponse, pUrl, ActiveMarket.name);

                SendMessage(this.ParentFormPtr, WM_LIVEUPDATE, IntPtr.Zero, IntPtr.Zero);

                LockedForUpdate = false;
                LiveSessionTimer.Start();
            }
        }
Пример #2
0
        public static void TestPOSTRequest()
        {
            WebRequest   request;
            WebResponse  response;
            StreamReader reader;
            GZipStream   gzipStream;
            string       responseText;

            MSHTML.HTMLDocument   htmlresponse = new MSHTML.HTMLDocument();
            MSHTML.IHTMLDocument2 webresponse  = (MSHTML.IHTMLDocument2)htmlresponse;
            string body = "curr_id=24442&smlID=1169009&st_date=11%2F18%2F2016&end_date=11%2F18%2F2017&interval_sec=Daily&sort_col=date&sort_ord=DESC&action=historical_data";

            try
            {
                request             = WebRequest.Create("https://ca.investing.com/instruments/HistoricalDataAjax");
                request.Credentials = CredentialCache.DefaultCredentials;
                ((HttpWebRequest)request).Accept    = "*/*";
                ((HttpWebRequest)request).Method    = "POST";
                ((HttpWebRequest)request).UserAgent = DEFAULT_USER_AGENT;
                ((HttpWebRequest)request).Referer   = "http://ca.investing.com/equities/canada";
                ((HttpWebRequest)request).Headers.Add("Accept-Encoding", "gzip,deflate");
                ((HttpWebRequest)request).Headers.Add("X-Requested-With", "XMLHttpRequest");
                ((HttpWebRequest)request).Timeout = 20000;

                request.ContentType   = "application/x-www-form-urlencoded; charset=UTF-8";
                request.ContentLength = body.Length;

                Stream rStream = request.GetRequestStream();
                rStream.Write(body.Select(c => (byte)c).ToArray(), 0, body.Length);

                response = request.GetResponse();

                if (response.Headers.Get("Content-Encoding").ToLower().Contains("gzip"))
                {
                    gzipStream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress);
                    reader     = new StreamReader(gzipStream);
                }
                else
                {
                    reader = new StreamReader(response.GetResponseStream());
                }
                responseText = reader.ReadToEnd();
                webresponse.write(responseText);

                while (webresponse.body == null)
                {
                    System.Windows.Forms.Application.DoEvents();
                }

                webresponse.close();

                reader.Close();
                response.Close();
            }
            catch (Exception)
            {
                /* Do nothing */
                //int stophere = 1;
            }
        }
Пример #3
0
 public IESelectorItem(MSHTML.HTMLDocument Document)
 {
     // this.element = new IEElement(element);
     Properties = new ObservableCollection <SelectorItemProperty>();
     if (!string.IsNullOrEmpty(Document.title))
     {
         Properties.Add(new SelectorItemProperty("title", Document.title));
     }
     Properties.Add(new SelectorItemProperty("Selector", "IE"));
     Properties.Add(new SelectorItemProperty("url", Document.url));
     foreach (var p in Properties)
     {
         p.Enabled    = true;
         p.canDisable = (Properties.Count > 1);
     }
     ;
     foreach (var p in Properties)
     {
         p.PropertyChanged += (sender, e) =>
         {
             OnPropertyChanged("Displayname");
             OnPropertyChanged("json");
         }
     }
     ;
 }
Пример #4
0
        /*****************************************************************************
        *  FUNCTION:  UpdateLiveData
        *  Description:
        *  Parameters:
        *          pLiveUrl -
        *****************************************************************************/
        public Boolean UpdateLiveData(String pLiveUrl = "")
        {
            bool success = true;

            MSHTML.HTMLDocument   htmlresponse = new MSHTML.HTMLDocument();
            MSHTML.IHTMLDocument2 webresponse  = (MSHTML.IHTMLDocument2)htmlresponse;

            try
            {
                if (pLiveUrl != "")
                {
                    LiveDataAddress = pLiveUrl;
                }

                if (LiveDataAddress != "")
                {
                    webresponse = Helpers.HTMLRequestResponse(LiveDataAddress);
                    ParseLiveData(webresponse);
                }
            }
            catch (Exception e)
            {
                success = false;
            }

            return(success);
        }
Пример #5
0
        private static void SendToCHIS(string bp1, string bp2)
        {
            string Url = System.Configuration.ConfigurationManager.AppSettings["Url"];

            SHDocVw.InternetExplorer ie = getInternetExploer(Url);
            if (ie != null)
            {
                try
                {
                    MSHTML.HTMLDocument doc = ie.Document;
                    object oFrameIndex      = 0;
                    var    f = (doc.frames.item(ref oFrameIndex)).document;
                    f.getElementById("DefaultContent_Console_2001001_1").innerText = bp1;
                    f.getElementById("DefaultContent_Console_2001001_2").innerText = bp2;
                    f.getElementById("DefaultContent_Console_2001001_2").blur();    //用来触发页面js里的GetConsole2001001()
                    //                traverseNodes(f.documentElement, ref cont);
                }
                catch (Exception)
                {
                    MessageBox.Show("请先将CHIS转到内科页面再测量血压");
                }
            }
            else
            {
                MessageBox.Show("没有找到IE Url:" + Url);
            }
        }
Пример #6
0
 private void WebBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
 {
     textBox1.Text = webBrowser1.Document.Url.ToString();
     MSHTML.HTMLDocument doc = (MSHTML.HTMLDocument)webBrowser1.Document.DomDocument;
     MSHTML.HTMLDocumentEvents2_Event iEvent;
     iEvent          = (MSHTML.HTMLDocumentEvents2_Event)doc;
     iEvent.onclick += new MSHTML.HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler);
 }
Пример #7
0
        public static MSHTML.IHTMLDocument2 HTMLRequestResponse(String pUrl)
        {
            WebRequest   request;
            WebResponse  response;
            StreamReader reader;
            GZipStream   gzipStream;
            string       responseText;

            MSHTML.HTMLDocument   htmlresponse = new MSHTML.HTMLDocument();
            MSHTML.IHTMLDocument2 webresponse  = (MSHTML.IHTMLDocument2)htmlresponse;

            try
            {
                if (pUrl != "")
                {
                    request             = WebRequest.Create(pUrl);
                    request.Credentials = CredentialCache.DefaultCredentials;
                    ((HttpWebRequest)request).Accept    = "*/*";
                    ((HttpWebRequest)request).UserAgent = DEFAULT_USER_AGENT;
                    ((HttpWebRequest)request).Referer   = "http://ca.investing.com/equities/canada";
                    ((HttpWebRequest)request).Headers.Add("Accept-Encoding", "gzip,deflate,br");
                    ((HttpWebRequest)request).Headers.Add("X-Requested-With", "XMLHttpRequest");
                    ((HttpWebRequest)request).KeepAlive = true;
                    ((HttpWebRequest)request).Timeout   = 20000;

                    response = request.GetResponse();

                    if (response.Headers.Get("Content-Encoding").ToLower().Contains("gzip"))
                    {
                        gzipStream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress);
                        reader     = new StreamReader(gzipStream);
                    }
                    else
                    {
                        reader = new StreamReader(response.GetResponseStream());
                    }
                    responseText = reader.ReadToEnd();
                    webresponse.write(responseText);

                    while (webresponse.body == null)
                    {
                        System.Windows.Forms.Application.DoEvents();
                    }

                    webresponse.close();

                    reader.Close();
                    response.Close();
                }
            }
            catch (Exception)
            {
                /* Do nothing */
                //int stophere = 1;
            }

            return(webresponse);
        }
Пример #8
0
        protected override void Execute(NativeActivityContext context)
        {
            var selector = Selector.Get(context);

            selector = OpenRPA.Interfaces.Selector.Selector.ReplaceVariables(selector, context.DataContext);
            var sel        = new IESelector(selector);
            var timeout    = Timeout.Get(context);
            var from       = From.Get(context);
            var maxresults = MaxResults.Get(context);

            if (maxresults < 1)
            {
                maxresults = 1;
            }
            IEElement[] elements = { };

            if (WaitForReady.Get(context))
            {
                var browser             = Browser.GetBrowser();
                MSHTML.HTMLDocument doc = browser.Document;
                var sw2 = new Stopwatch();
                sw2.Start();
                while (sw2.Elapsed < timeout && doc.readyState != "complete" && doc.readyState != "interactive")
                {
                    // Log.Debug("pending complete, readyState: " + doc.readyState);
                    System.Threading.Thread.Sleep(100);
                }
            }

            var sw = new Stopwatch();

            sw.Start();
            do
            {
                elements = IESelector.GetElementsWithuiSelector(sel, from);
            } while (elements.Count() == 0 && sw.Elapsed < timeout);
            if (elements.Count() > maxresults)
            {
                elements = elements.Take(maxresults).ToArray();
            }
            context.SetValue(Elements, elements);
            IEnumerator <IEElement> _enum = elements.ToList().GetEnumerator();

            context.SetValue(_elements, _enum);
            bool more = _enum.MoveNext();

            if (more)
            {
                context.ScheduleAction(Body, _enum.Current, OnBodyComplete);
            }
            else
            {
                throw new Interfaces.ElementNotFoundException("Failed locating item");
            }
        }
Пример #9
0
        private void enumElements(Browser browser, MSHTML.IHTMLElement baseelement, IESelector anchor, bool doEnum, int X, int Y)
        {
            MSHTML.IHTMLElement element  = baseelement;
            MSHTML.HTMLDocument document = browser.Document;
            var pathToRoot = new List <MSHTML.IHTMLElement>();

            while (element != null)
            {
                if (pathToRoot.Contains(element))
                {
                    break;
                }
                try
                {
                    pathToRoot.Add(element);
                }
                catch (Exception)
                {
                }
                try
                {
                    element = element.parentElement;
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                    return;
                }
            }
            // Log.Selector(string.Format("IEselector::create pathToRoot::end {0:mm\\:ss\\.fff}", sw.Elapsed));
            pathToRoot.Reverse();
            if (anchor != null)
            {
                // var hasIframe = anchor.Where(x => x.Properties.Where(y=>y.Name=="tagName" && y.Value== "IFRAME").Count()>0).Count() > 0;
                var iframeidx = 0;
                for (var i = 0; i < anchor.Count(); i++)
                {
                    if (anchor[i].Properties.Where(y => y.Name == "tagName" && y.Value == "IFRAME").Count() > 0)
                    {
                        iframeidx = i;
                        break;
                    }
                }
                var anchorlist = anchor.Where(x => x.Enabled && x.Selector == null).ToList();
                //if (iframeidx>-1)
                //{
                //    for (var i = 0; i < iframeidx; i++)
                //    {
                //        pathToRoot.Remove(pathToRoot[0]);
                //    }
                //}
                for (var i = (iframeidx); i < anchorlist.Count(); i++)
                {
                    //if (((IESelectorItem)anchorlist[i]).Match(pathToRoot[0]))
                    if (IESelectorItem.Match(anchorlist[i], pathToRoot[0]))
                    {
                        pathToRoot.Remove(pathToRoot[0]);
                    }
                    else
                    {
                        Log.Selector("Element does not match the anchor path");
                        return;
                    }
                }
            }

            if (pathToRoot.Count == 0)
            {
                Log.Error("Element is same as annchor");
                return;
            }
            element = pathToRoot.Last();
            //
            // Log.Selector(string.Format("IEselector::remove anchor if needed::end {0:mm\\:ss\\.fff}", sw.Elapsed));
            IESelectorItem item;

            if (anchor == null && Items.Count == 0)
            {
                item         = new IESelectorItem(browser.Document);
                item.Enabled = true;
                //item.canDisable = false;
                Items.Add(item);
            }
            for (var i = 0; i < pathToRoot.Count(); i++)
            {
                var o = pathToRoot[i];
                item = new IESelectorItem(browser, o);
                if (i == 0 || i == (pathToRoot.Count() - 1))
                {
                    item.canDisable = false;
                }
                foreach (var p in item.Properties)
                {
                    int idx = p.Value.IndexOf(".");
                    if (p.Name == "className" && idx > -1)
                    {
                        int idx2 = p.Value.IndexOf(".", idx + 1);
                        if (idx2 > idx)
                        {
                            p.Value = p.Value.Substring(0, idx2 + 1) + "*";
                        }
                    }
                }
                if (doEnum)
                {
                    item.EnumNeededProperties(o, o.parentElement);
                }

                Items.Add(item);
            }
            if (frameTags.Contains(baseelement.tagName.ToUpper()))
            {
                //var ele2 = baseelement as MSHTML.IHTMLElement2;
                //var col2 = ele2.getClientRects();
                //var rect2 = col2.item(0);
                //X -= rect2.left;
                //Y -= rect2.top;
                var frame = baseelement as MSHTML.HTMLFrameElement;
                var fffff = frame.contentWindow;
                MSHTML.IHTMLWindow2 window = frame.contentWindow;
                MSHTML.IHTMLElement el2    = null;
                foreach (string frameTag in frameTags)
                {
                    MSHTML.IHTMLElementCollection framesCollection = document.getElementsByTagName(frameTag);
                    foreach (MSHTML.IHTMLElement _frame in framesCollection)
                    {
                        // var _f = _frame as MSHTML.HTMLFrameElement;
                        el2 = browser.ElementFromPoint(_frame, X, Y);
                        //var _wb = _f as SHDocVw.IWebBrowser2;
                        //document = _wb.Document as MSHTML.HTMLDocument;
                        //el2 = document.elementFromPoint(X, Y);
                        if (el2 != null)
                        {
                            var tag = el2.tagName;
                            // var html = el2.innerHTML;
                            Log.Selector("tag: " + tag);

                            //browser.elementx += _frame.offsetLeft;
                            //browser.elementy += _frame.offsetTop;
                            //browser.frameoffsetx += _frame.offsetLeft;
                            //browser.frameoffsety += _frame.offsetTop;


                            enumElements(browser, el2, anchor, doEnum, X, Y);
                            return;
                        }
                    }
                }
            }
        }
Пример #10
0
        protected override void StartLoop(NativeActivityContext context)
        {
            var selector = Selector.Get(context);

            selector = OpenRPA.Interfaces.Selector.Selector.ReplaceVariables(selector, context.DataContext);
            var sel     = new IESelector(selector);
            var timeout = Timeout.Get(context);

            if (Timeout == null || Timeout.Expression == null)
            {
                timeout = TimeSpan.FromSeconds(3);
            }
            var from       = From.Get(context);
            var maxresults = MaxResults.Get(context);
            var minresults = MinResults.Get(context);

            if (maxresults < 1)
            {
                maxresults = 1;
            }
            IEElement[] elements = { };
            if (timeout.Minutes > 5 || timeout.Hours > 1)
            {
                Activity _Activity = null;
                try
                {
                    var strProperty = context.GetType().GetProperty("Activity", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
                    var strGetter   = strProperty.GetGetMethod(nonPublic: true);
                    _Activity = (Activity)strGetter.Invoke(context, null);
                }
                catch (Exception)
                {
                }
                if (_Activity != null)
                {
                    Log.Warning("Timeout for Activity " + _Activity.Id + " is above 5 minutes, was this the intention ? calculated value " + timeout.ToString());
                }
                else
                {
                    Log.Warning("Timeout for on of your IE.GetElements is above 5 minutes, was this the intention ? calculated value " + timeout.ToString());
                }
            }

            if (WaitForReady.Get(context))
            {
                var browser             = Browser.GetBrowser(false);
                MSHTML.HTMLDocument doc = browser.Document;
                var sw2 = new Stopwatch();
                sw2.Start();
                string readyState = "";
                while (sw2.Elapsed < timeout && readyState != "complete" && readyState != "interactive")
                {
                    try
                    {
                        readyState = doc.readyState;
                    }
                    catch (Exception)
                    {
                        browser = Browser.GetBrowser(true);
                    }
                    // Log.Debug("pending complete, readyState: " + doc.readyState);
                    System.Threading.Thread.Sleep(100);
                }
            }

            var sw = new Stopwatch();

            sw.Start();
            do
            {
                elements = IESelector.GetElementsWithuiSelector(sel, from, maxresults);
            } while (elements.Count() == 0 && sw.Elapsed < timeout);
            if (elements.Count() > maxresults)
            {
                elements = elements.Take(maxresults).ToArray();
            }
            if (elements.Length < minresults)
            {
                Log.Selector(string.Format("Windows.GetElement::Failed locating " + minresults + " item(s) {0:mm\\:ss\\.fff}", sw.Elapsed));
                throw new ElementNotFoundException("Failed locating " + minresults + " item(s)");
            }

            context.SetValue(Elements, elements);
            IEnumerator <IEElement> _enum = elements.ToList().GetEnumerator();

            context.SetValue(_elements, _enum);
            bool more = _enum.MoveNext();

            if (more)
            {
                IncIndex(context);
                SetTotal(context, elements.Length);
                context.ScheduleAction(Body, _enum.Current, OnBodyComplete);
            }
        }
Пример #11
0
        /*****************************************************************************
        *  FUNCTION:       updateDataManagerConfig
        *  Description:
        *  Parameters:     None
        *****************************************************************************/
        private bool updateDataManagerConfig()
        {
            bool success = true;
            int  index1, index2;

            //Web Request / Response locals
            String      baseUrl, subUrl, responseText, parseText;
            WebRequest  request;
            WebResponse response;

            MSHTML.HTMLDocument   htmlresponse = new MSHTML.HTMLDocument();
            MSHTML.IHTMLDocument2 webresponse = (MSHTML.IHTMLDocument2)htmlresponse;

            //Xml objects
            XmlDocument  configFile = new XmlDocument();
            XmlNodeList  nodeList, keyNodeList, subNodeList, configMarketsNodeList, configOptionNodeList;
            XmlDocument  KeyElement = new XmlDocument();
            XmlNode      marketNode;
            StreamReader reader;

            List <String> listOfMarkets;
            List <String> listOfOptions;

            string application_path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
            string config_path      = Path.Combine(application_path, MyMarketAnalyzer.Properties.Resources.DataManagerConfigPath);

            config_path = new Uri(config_path).LocalPath;

            configFile.Load(config_path);

            nodeList = configFile.SelectNodes("Datamanager/Live/Markets/Schema");

            index1    = -1;
            index2    = -1;
            parseText = "";
            try
            {
                baseUrl             = nodeList[0].Attributes.GetNamedItem("url").InnerText;
                request             = WebRequest.Create(baseUrl);
                request.Credentials = CredentialCache.DefaultCredentials;
                ((HttpWebRequest)request).Accept    = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                ((HttpWebRequest)request).UserAgent = DEFAULT_USER_AGENT;
                ((HttpWebRequest)request).Timeout   = 20000;

                response = request.GetResponse();

                reader       = new StreamReader(response.GetResponseStream());
                responseText = reader.ReadToEnd();
                reader.Close();
                response.Close();

                //write response to string
                webresponse.write(responseText);

                //begin search for the menu items we want
                keyNodeList = GetConfiguredItems(responseText, configFile, "Datamanager/Live/Markets/Schema/");

                configMarketsNodeList = configFile.SelectNodes("Datamanager/Live/Markets/Data/Market");
                listOfMarkets         = new List <string>();

                for (int i = 0; i < configMarketsNodeList.Count; i++)
                {
                    listOfMarkets.Add(configMarketsNodeList[i].Attributes.GetNamedItem("name").InnerText);
                }

                //For each geographic location, get the list of available markets / indexes
                foreach (XmlNode subNode in keyNodeList)
                {
                    if (subNode.InnerXml != "")
                    {
                        index1    = subNode.OuterXml.IndexOf("href=\"", 0) + 6;
                        index2    = subNode.OuterXml.IndexOf("\"", index1);
                        parseText = subNode.OuterXml.Substring(index1, index2 - index1);
                        subUrl    = (new Uri(new Uri(baseUrl), parseText)).ToString();

                        if (parseText.Substring(0, 1) != "/")
                        {
                            parseText = "/" + parseText;
                        }

                        if (listOfMarkets.Contains(subNode.InnerXml))
                        {
                            marketNode = configMarketsNodeList[listOfMarkets.IndexOf(subNode.InnerXml)];
                        }
                        else
                        {
                            marketNode = configFile.CreateNode("element", "Market", "");

                            XmlAttribute atHref = configFile.CreateAttribute("href");
                            atHref.Value = parseText;

                            XmlAttribute atName = configFile.CreateAttribute("name");
                            atName.Value = subNode.InnerText;

                            marketNode.Attributes.Append(atHref);
                            marketNode.Attributes.Append(atName);

                            configFile.SelectNodes("Datamanager/Live/Markets/Data")[0].InsertAfter(marketNode, configMarketsNodeList[configMarketsNodeList.Count - 1]);
                        }

                        responseText        = "";
                        request             = WebRequest.Create(subUrl);
                        request.Credentials = CredentialCache.DefaultCredentials;
                        ((HttpWebRequest)request).Accept    = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                        ((HttpWebRequest)request).UserAgent = DEFAULT_USER_AGENT;
                        ((HttpWebRequest)request).Timeout   = 20000;

                        response = request.GetResponse();

                        reader       = new StreamReader(response.GetResponseStream());
                        responseText = reader.ReadToEnd();
                        reader.Close();
                        response.Close();

                        //write response to string
                        webresponse.write(responseText);

                        subNodeList          = GetConfiguredItems(responseText, configFile, "Datamanager/Live/Markets/Data/Schema/");
                        listOfOptions        = new List <string>();
                        configOptionNodeList = null;

                        if (marketNode.HasChildNodes)
                        {
                            configOptionNodeList = marketNode.SelectNodes("option");

                            for (int i = 0; i < configOptionNodeList.Count; i++)
                            {
                                listOfOptions.Add(configOptionNodeList[i].Attributes.GetNamedItem("id").InnerText);
                            }
                        }

                        foreach (XmlNode optionNode in subNodeList)
                        {
                            //Only add options that aren't already in the list (based on id)
                            if (!listOfOptions.Contains(optionNode.Attributes.GetNamedItem("id").InnerText))
                            {
                                XmlNode newOption = configFile.ImportNode(optionNode, true);
                                if (configOptionNodeList == null)
                                {
                                    marketNode.AppendChild(newOption);
                                }
                                else
                                {
                                    marketNode.InsertAfter(newOption, configOptionNodeList[configOptionNodeList.Count - 1]);
                                }
                            }
                        }
                    }
                }

                configFile.Save(config_path);
            }
            catch (Exception e)
            {
                success = false;
            }

            return(success);
        }
Пример #12
0
        protected override void StartLoop(NativeActivityContext context)
        {
            var selector = Selector.Get(context);

            selector = OpenRPA.Interfaces.Selector.Selector.ReplaceVariables(selector, context.DataContext);
            var sel        = new IESelector(selector);
            var timeout    = Timeout.Get(context);
            var from       = From.Get(context);
            var maxresults = MaxResults.Get(context);
            var minresults = MinResults.Get(context);

            if (maxresults < 1)
            {
                maxresults = 1;
            }
            IEElement[] elements = { };

            if (WaitForReady.Get(context))
            {
                var browser             = Browser.GetBrowser(false);
                MSHTML.HTMLDocument doc = browser.Document;
                var sw2 = new Stopwatch();
                sw2.Start();
                string readyState = "";
                while (sw2.Elapsed < timeout && readyState != "complete" && readyState != "interactive")
                {
                    try
                    {
                        readyState = doc.readyState;
                    }
                    catch (Exception)
                    {
                        browser = Browser.GetBrowser(true);
                    }
                    // Log.Debug("pending complete, readyState: " + doc.readyState);
                    System.Threading.Thread.Sleep(100);
                }
            }

            var sw = new Stopwatch();

            sw.Start();
            do
            {
                elements = IESelector.GetElementsWithuiSelector(sel, from, maxresults);
            } while (elements.Count() == 0 && sw.Elapsed < timeout);
            if (elements.Count() > maxresults)
            {
                elements = elements.Take(maxresults).ToArray();
            }
            if (elements.Length < minresults)
            {
                Log.Selector(string.Format("Windows.GetElement::Failed locating " + minresults + " item(s) {0:mm\\:ss\\.fff}", sw.Elapsed));
                throw new ElementNotFoundException("Failed locating " + minresults + " item(s)");
            }

            context.SetValue(Elements, elements);
            IEnumerator <IEElement> _enum = elements.ToList().GetEnumerator();

            context.SetValue(_elements, _enum);
            bool more = _enum.MoveNext();

            if (more)
            {
                context.ScheduleAction(Body, _enum.Current, OnBodyComplete);
            }
        }