protected override void Execute(NativeActivityContext context) { var selector = Selector.Get(context); var sel = new IESelector(selector); var timeout = TimeSpan.FromSeconds(3); var from = From.Get(context); IEElement[] elements = { }; var sw = new Stopwatch(); sw.Start(); do { elements = IESelector.GetElementsWithuiSelector(sel, from); } while (elements.Count() == 0 && sw.Elapsed < timeout); 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"); } }
public IESelector(Browser browser, MSHTML.IHTMLElement baseelement, IESelector anchor, bool doEnum, int X, int Y) { var sw = new System.Diagnostics.Stopwatch(); sw.Start(); Log.Selector(string.Format("IEselector::AutomationElement::begin {0:mm\\:ss\\.fff}", sw.Elapsed)); Log.Selector(string.Format("IEselector::GetControlViewWalker::end {0:mm\\:ss\\.fff}", sw.Elapsed)); Clear(); if (PluginConfig.enable_xpath_support) { var item = new IESelectorItem(browser.Document); item.Enabled = true; //item.canDisable = false; Items.Add(item); var xpath = XPath.getXPath(baseelement); item = new IESelectorItem(); item.Properties = new ObservableCollection <SelectorItemProperty>(); item.IEElement = new IEElement(browser, baseelement); item.Element = item.IEElement; item.Properties.Add(new SelectorItemProperty("xpath", xpath)); Items.Add(item); } else { enumElements(browser, baseelement, anchor, doEnum, X, Y); } Log.Selector(string.Format("IEselector::EnumNeededProperties::end {0:mm\\:ss\\.fff}", sw.Elapsed)); OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("Count")); OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("Item[]")); OnCollectionChanged(new System.Collections.Specialized.NotifyCollectionChangedEventArgs(System.Collections.Specialized.NotifyCollectionChangedAction.Reset)); }
private void Open_Selector(object sender, RoutedEventArgs e) { ModelItem loadFrom = ModelItem.Parent; string loadFromSelectorString = ""; IESelector anchor = null; while (loadFrom.Parent != null) { var p = loadFrom.Properties.Where(x => x.Name == "Selector").FirstOrDefault(); if (p != null) { loadFromSelectorString = loadFrom.GetValue <string>("Selector"); anchor = new IESelector(loadFromSelectorString); break; } loadFrom = loadFrom.Parent; } string SelectorString = ModelItem.GetValue <string>("Selector"); int maxresults = ModelItem.GetValue <int>("MaxResults"); Interfaces.Selector.SelectorWindow selectors; if (!string.IsNullOrEmpty(SelectorString)) { var selector = new IESelector(SelectorString); selectors = new Interfaces.Selector.SelectorWindow("IE", selector, anchor, maxresults); } else { var selector = new IESelector("[{Selector: 'IE'}]"); selectors = new Interfaces.Selector.SelectorWindow("IE", selector, anchor, maxresults); } if (selectors.ShowDialog() == true) { ModelItem.Properties["Selector"].SetValue(new InArgument <string>() { Expression = new Literal <string>(selectors.vm.json) }); var l = selectors.vm.Selector.Last(); if (l.Element != null) { ModelItem.Properties["Image"].SetValue(l.Element.ImageString()); NotifyPropertyChanged("Image"); } if (anchor != null) { ModelItem.Properties["From"].SetValue(new InArgument <IEElement>() { Expression = new Microsoft.VisualBasic.Activities.VisualBasicValue <IEElement>("item") }); ModelItem.Properties["MinResults"].SetValue(new InArgument <int>() { Expression = new Microsoft.VisualBasic.Activities.VisualBasicValue <int>("0") }); ModelItem.Properties["Timeout"].SetValue(new InArgument <TimeSpan>() { Expression = new Microsoft.VisualBasic.Activities.VisualBasicValue <TimeSpan>("TimeSpan.FromSeconds(0)") }); } } }
public static treeelement[] _GetRootElements(Selector anchor) { var browser = Browser.GetBrowser(); if (browser == null) { Log.Warning("Failed locating an Internet Explore instance"); return(new treeelement[] { }); } if (anchor != null) { IESelector ieselector = anchor as IESelector; if (ieselector == null) { ieselector = new IESelector(anchor.ToString()); } var elements = IESelector.GetElementsWithuiSelector(ieselector, null, 5); var result = new List <treeelement>(); foreach (var _ele in elements) { var e = new IETreeElement(null, true, _ele); result.Add(e); } return(result.ToArray()); } else { var e = new IETreeElement(null, true, new IEElement(browser, browser.Document.documentElement)); return(new treeelement[] { e }); } }
public bool parseUserAction(ref IRecordEvent e) { if (e.UIElement == null) { return(false); } if (e.UIElement.ProcessId < 1) { return(false); } var p = System.Diagnostics.Process.GetProcessById(e.UIElement.ProcessId); if (p.ProcessName != "iexplore" && p.ProcessName != "iexplore.exe") { return(false); } var browser = new Browser(e.UIElement.RawElement); var htmlelement = browser.ElementFromPoint(e.X, e.Y); if (htmlelement == null) { return(false); } var selector = new IESelector(browser, htmlelement, null, true, e.X, e.Y); e.Selector = selector; e.Element = new IEElement(browser, htmlelement); var a = new GetElement { DisplayName = (htmlelement.id + "-" + htmlelement.tagName + "-" + htmlelement.className).Replace(Environment.NewLine, "").Trim() }; a.Selector = selector.ToString(); a.Image = selector.Last().Element.ImageString(); var last = selector.Last() as IESelectorItem; var tagName = last.tagName; if (string.IsNullOrEmpty(tagName)) { tagName = ""; } tagName = tagName.ToLower(); e.a = new GetElementResult(a); if (tagName == "input") { // MSHTML.IHTMLInputElement inputelement = (MSHTML.IHTMLInputElement)htmlelement; e.SupportInput = (last.type.ToLower() == "text" || last.type.ToLower() == "password"); } return(true); }
private void OnMouseUp(InputEventArgs e) { var thread = new Thread(new ThreadStart(() => { Log.Debug(string.Format("IE.Recording::OnMouseUp::begin")); var re = new RecordEvent(); re.Button = e.Button; var a = new GetElement { DisplayName = (e.Element.Name).Replace(Environment.NewLine, "").Trim() }; var browser = new Browser(e.Element.RawElement); var htmlelement = browser.ElementFromPoint(e.X, e.Y); if (htmlelement == null) { return; } var sw = new System.Diagnostics.Stopwatch(); sw.Start(); IESelector sel = null; // sel = new IESelector(e.Element.rawElement, null, true); GenericTools.RunUI(() => { sel = new IESelector(browser, htmlelement, null, false, e.X, e.Y); }); if (sel == null) { return; } if (sel.Count < 2) { return; } a.Selector = sel.ToString(); a.Image = sel.Last().Element.ImageString(); re.UIElement = e.Element; re.Element = new IEElement(browser, htmlelement); re.Selector = sel; re.X = e.X; re.Y = e.Y; Log.Debug(e.Element.SupportInput + " / " + e.Element.ControlType); re.a = new GetElementResult(a); if (htmlelement.tagName.ToLower() == "input" && htmlelement.tagName.ToLower() == "select") { MSHTML.IHTMLInputElement inputelement = (MSHTML.IHTMLInputElement)htmlelement; re.SupportInput = (inputelement.type.ToLower() == "text" || inputelement.type.ToLower() == "password"); } Log.Debug(string.Format("IE.Recording::OnMouseUp::end {0:mm\\:ss\\.fff}", sw.Elapsed)); OnUserAction?.Invoke(this, re); })); thread.IsBackground = true; thread.Start(); }
public IElement[] GetElementsWithSelector(Selector selector, IElement fromElement = null, int maxresults = 1) { if (!(selector is IESelector ieselector)) { ieselector = new IESelector(selector.ToString()); } var result = IESelector.GetElementsWithuiSelector(ieselector, fromElement, maxresults); return(result); }
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"); } }
public Interfaces.Selector.Selector GetSelector(Selector anchor, Interfaces.Selector.treeelement item) { var ieitem = item as IETreeElement; IESelector ieanchor = anchor as IESelector; if (ieanchor == null && anchor != null) { ieanchor = new IESelector(anchor.ToString()); } return(new IESelector(ieitem.IEElement.Browser, ieitem.IEElement.RawElement, ieanchor, true, 0, 0)); }
private async void Highlight_Click(object sender, RoutedEventArgs e) { string SelectorString = ModelItem.GetValue <string>("Selector"); int maxresults = ModelItem.GetValue <int>("MaxResults"); var selector = new IESelector(SelectorString); var elements = IESelector.GetElementsWithuiSelector(selector, null, maxresults); foreach (var ele in elements) { await ele.Highlight(false, System.Drawing.Color.Red, TimeSpan.FromSeconds(1)); } }
public bool parseUserAction(ref IRecordEvent e) { if (e.UIElement == null) { return(false); } if (e.UIElement.ProcessId < 1) { return(false); } var p = System.Diagnostics.Process.GetProcessById(e.UIElement.ProcessId); if (p.ProcessName != "iexplore" && p.ProcessName != "iexplore.exe") { return(false); } var browser = new Browser(e.UIElement.rawElement); var htmlelement = browser.ElementFromPoint(e.X, e.Y); if (htmlelement == null) { return(false); } var selector = new IESelector(htmlelement, null, browser.Document, false); var a = new GetElement { DisplayName = htmlelement.id + "-" + htmlelement.tagName + "-" + htmlelement.className }; a.Selector = selector.ToString(); var tagName = htmlelement.tagName; if (string.IsNullOrEmpty(tagName)) { tagName = ""; } tagName = tagName.ToLower(); e.a = new GetElementResult(a); if (tagName == "input") { mshtml.IHTMLInputElement inputelement = (mshtml.IHTMLInputElement)htmlelement; e.SupportInput = (inputelement.type.ToLower() == "text" || inputelement.type.ToLower() == "password"); } return(true); }
private void Highlight_Click(object sender, RoutedEventArgs e) { ModelItem loadFrom = ModelItem.Parent; string loadFromSelectorString = ""; IESelector anchor = null; while (loadFrom.Parent != null) { var p = loadFrom.Properties.Where(x => x.Name == "Selector").FirstOrDefault(); if (p != null) { loadFromSelectorString = loadFrom.GetValue <string>("Selector"); anchor = new IESelector(loadFromSelectorString); break; } loadFrom = loadFrom.Parent; } HighlightImage = IEExtensions.GetImageSourceFromResource(".x.png"); NotifyPropertyChanged("HighlightImage"); string SelectorString = ModelItem.GetValue <string>("Selector"); int maxresults = ModelItem.GetValue <int>("MaxResults"); var selector = new IESelector(SelectorString); var elements = new List <IEElement>(); if (anchor != null) { var _base = IESelector.GetElementsWithuiSelector(anchor, null, 10); foreach (var _e in _base) { var res = IESelector.GetElementsWithuiSelector(selector, _e, maxresults); elements.AddRange(res); } } else { var res = IESelector.GetElementsWithuiSelector(selector, null, maxresults); elements.AddRange(res); } if (elements.Count() > 0) { HighlightImage = IEExtensions.GetImageSourceFromResource("check.png"); NotifyPropertyChanged("HighlightImage"); } foreach (var ele in elements) { ele.Highlight(false, System.Drawing.Color.Red, TimeSpan.FromSeconds(1)); } }
public IESelector(Browser browser, MSHTML.IHTMLElement baseelement, IESelector anchor, bool doEnum, int X, int Y) { var sw = new System.Diagnostics.Stopwatch(); sw.Start(); Log.Selector(string.Format("IEselector::AutomationElement::begin {0:mm\\:ss\\.fff}", sw.Elapsed)); Log.Selector(string.Format("IEselector::GetControlViewWalker::end {0:mm\\:ss\\.fff}", sw.Elapsed)); Clear(); enumElements(browser, baseelement, anchor, doEnum, X, Y); Log.Selector(string.Format("IEselector::EnumNeededProperties::end {0:mm\\:ss\\.fff}", sw.Elapsed)); OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("Count")); OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("Item[]")); OnCollectionChanged(new System.Collections.Specialized.NotifyCollectionChangedEventArgs(System.Collections.Specialized.NotifyCollectionChangedAction.Reset)); }
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 = { }; 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"); } }
public override IElement[] GetElements(IElement fromElement = null, int maxresults = 1) { return(IESelector.GetElementsWithuiSelector(this, fromElement, maxresults)); }
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); } }
public static IEElement[] GetElementsWithuiSelector(IESelector selector, IElement fromElement = null, int maxresults = 1) { IEElement iefromElement = fromElement as IEElement; Browser browser; if (iefromElement != null) { browser = iefromElement.Browser; } else { browser = Browser.GetBrowser(); } if (browser == null) { Log.Warning("Failed locating an Internet Explore instance"); return(new IEElement[] { }); } var sw = new System.Diagnostics.Stopwatch(); sw.Start(); IEElement _fromElement = fromElement as IEElement; var selectors = selector.Where(x => x.Enabled == true && x.Selector == null).ToList(); var current = new List <IEElement>(); IEElement[] result = null; int startIndex = 1; if (iefromElement != null) { startIndex = 0; current.Add(iefromElement); } else { MSHTML.IHTMLElement startfrom = null; startfrom = browser.Document.documentElement; current.Add(new IEElement(browser, startfrom)); } for (var i = startIndex; i < selectors.Count; i++) { var s = new IESelectorItem(selectors[i]); var elements = new List <IEElement>(); elements.AddRange(current); current.Clear(); int failcounter = 0; do { foreach (var _element in elements) { MSHTML.IHTMLElement[] matches; if (frameTags.Contains(_element.tagName.ToUpper())) { if (s.tagName.ToUpper() == "HTML") { i++; s = new IESelectorItem(selectors[i]); } var _f = _element.RawElement as MSHTML.HTMLFrameElement; MSHTML.DispHTMLDocument doc = (MSHTML.DispHTMLDocument)((SHDocVw.IWebBrowser2)_f).Document; var _doc = doc.documentElement as MSHTML.IHTMLElement; matches = ((IESelectorItem)s).matches(_doc); browser.elementx += _f.offsetLeft; browser.elementy += _f.offsetTop; browser.frameoffsetx += _f.offsetLeft; browser.frameoffsety += _f.offsetTop; } else { matches = ((IESelectorItem)s).matches(_element.RawElement); } var uimatches = new List <IEElement>(); foreach (var m in matches) { var ui = new IEElement(browser, m); uimatches.Add(ui); } current.AddRange(uimatches.ToArray()); Log.Selector("add " + uimatches.Count + " matches to current"); } if (current.Count == 0) { ++failcounter; string message = string.Format("Failer # " + failcounter + " finding any hits for selector # " + i + " {0:mm\\:ss\\.fff}", sw.Elapsed) + "\n"; message += "lookin for \n" + s.ToString() + "\n"; foreach (var _element in elements) { MSHTML.IHTMLElementCollection children = _element.RawElement.children; foreach (MSHTML.IHTMLElement elementNode in children) { var ui = new IEElement(browser, elementNode); message += ui.ToString() + "\n"; } var matches = ((IESelectorItem)s).matches(_element.RawElement); } Log.Selector(message); } else { Log.Selector(string.Format("Found " + current.Count + " hits for selector # " + i + " {0:mm\\:ss\\.fff}", sw.Elapsed)); } } while (failcounter < 2 && current.Count == 0); if (i == (selectors.Count - 1)) { result = current.ToArray(); } if (current.Count == 0) { var message = "needed to find " + Environment.NewLine + selectors[i].ToString() + Environment.NewLine + "but found only: " + Environment.NewLine; foreach (var element in elements) { MSHTML.IHTMLElementCollection children = element.RawElement.children; foreach (MSHTML.IHTMLElement c in children) { try { // message += automationutil.getSelector(c, (i == selectors.Count - 1)) + Environment.NewLine; } catch (Exception) { } } } Log.Selector(message); return(new IEElement[] { }); } } if (result == null) { return new IEElement[] { } } ; Log.Selector(string.Format("GetElementsWithuiSelector::end {0:mm\\:ss\\.fff}", sw.Elapsed)); return(result); } }
private void ParseMouseUp(InputEventArgs e) { try { // if(string.IsNullOrEmpty(Thread.CurrentThread.Name)) Thread.CurrentThread.Name = "IE.Plugin.OnMouseUP"; Log.Debug(string.Format("IE.Recording::OnMouseUp::begin")); var re = new RecordEvent { Button = e.Button }; var a = new GetElement { DisplayName = (e.Element.Name).Replace(Environment.NewLine, "").Trim() }; a.Variables.Add(new Variable <int>("Index", 0)); a.Variables.Add(new Variable <int>("Total", 0)); using (var p = System.Diagnostics.Process.GetProcessById(e.Element.ProcessId)) { if (p.ProcessName != "iexplore" && p.ProcessName != "iexplore.exe") { return; } } var browser = new Browser(); var htmlelement = browser.ElementFromPoint(e.X, e.Y); if (htmlelement == null) { return; } var sw = new System.Diagnostics.Stopwatch(); sw.Start(); IESelector sel = null; // sel = new IESelector(e.Element.rawElement, null, true); GenericTools.RunUI(() => { try { sel = new IESelector(browser, htmlelement, null, false, e.X, e.Y); } catch (Exception ex) { Log.Error(ex.ToString()); } }); if (sel == null) { return; } if (sel.Count < 2) { return; } a.Selector = sel.ToString(); a.Image = sel.Last().Element.ImageString(); re.UIElement = e.Element; re.Element = new IEElement(browser, htmlelement); re.Selector = sel; re.X = e.X; re.Y = e.Y; Log.Debug(e.Element.SupportInput + " / " + e.Element.ControlType); re.a = new GetElementResult(a); //if (htmlelement.tagName.ToLower() == "input" && htmlelement.tagName.ToLower() == "select") if (htmlelement.tagName.ToLower() == "input") { MSHTML.IHTMLInputElement inputelement = (MSHTML.IHTMLInputElement)htmlelement; re.SupportInput = (inputelement.type.ToLower() == "text" || inputelement.type.ToLower() == "password"); } re.SupportSelect = false; Log.Debug(string.Format("IE.Recording::OnMouseUp::end {0:mm\\:ss\\.fff}", sw.Elapsed)); OnUserAction?.Invoke(this, re); } catch (Exception ex) { Log.Error(ex.ToString()); } }
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); } }
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; } } } } }
public static IEElement[] GetElementsWithuiSelector(IESelector selector, IElement fromElement = null, int maxresults = 1) { IEElement iefromElement = fromElement as IEElement; Browser browser; if (iefromElement != null) { browser = iefromElement.Browser; } else { browser = Browser.GetBrowser(false); } if (browser == null) { Log.Warning("Failed locating an Internet Explore instance"); return(new IEElement[] { }); } var sw = new System.Diagnostics.Stopwatch(); sw.Start(); IEElement _fromElement = fromElement as IEElement; var selectors = selector.Where(x => x.Enabled == true && x.Selector == null).ToList(); var current = new List <IEElement>(); IEElement[] result = null; int startIndex = 1; if (!string.IsNullOrEmpty(selector.xpath)) { // https://stackoverflow.com/questions/6953553/is-there-a-js-library-to-provide-xpath-capacities-to-ie var _results = new List <IEElement>(); try { string body = null; Log.Selector(string.Format("Create IHTMLDocument3 {0:mm\\:ss\\.fff}", sw.Elapsed)); MSHTML.IHTMLDocument3 sourceDoc = (MSHTML.IHTMLDocument3)browser.Document; body = sourceDoc.documentElement.outerHTML; HtmlAgilityPack.HtmlDocument targetDoc = new HtmlAgilityPack.HtmlDocument(); Log.SelectorVerbose(string.Format("targetDoc.LoadHtml {0:mm\\:ss\\.fff}", sw.Elapsed)); targetDoc.LoadHtml(body); if (fromElement != null && fromElement is IEElement fromie) { HtmlAgilityPack.HtmlNode from = targetDoc.DocumentNode.SelectSingleNode(fromie.xpath); if (from == null) { throw new Exception("Failed locating from node, by xpath '" + fromie.xpath + "'"); } Log.Selector(string.Format("SelectNodes {0:mm\\:ss\\.fff}", sw.Elapsed)); var xpath = selector.xpath; if (xpath.StartsWith("//")) { xpath = "." + xpath; } var nodes = from.SelectNodes(xpath); if (nodes != null) { foreach (var node in nodes) { Log.SelectorVerbose(string.Format("new IEElement {0:mm\\:ss\\.fff}", sw.Elapsed)); var ele = new IEElement(browser, node); _results.Add(ele); if (_results.Count >= maxresults) { break; } } } } else { Log.Selector(string.Format("SelectNodes {0:mm\\:ss\\.fff}", sw.Elapsed)); var nodes = targetDoc.DocumentNode.SelectNodes(selector.xpath); if (nodes != null) { foreach (var node in nodes) { Log.SelectorVerbose(string.Format("new IEElement {0:mm\\:ss\\.fff}", sw.Elapsed)); var ele = new IEElement(browser, node); _results.Add(ele); if (_results.Count >= maxresults) { break; } } } } } catch (Exception) { browser = Browser.GetBrowser(true); } Log.Selector(string.Format("GetElementsWithuiSelector::end {0:mm\\:ss\\.fff}", sw.Elapsed)); return(_results.ToArray()); } if (iefromElement != null) { startIndex = 0; current.Add(iefromElement); } else { MSHTML.IHTMLElement startfrom = null; startfrom = browser.Document.documentElement; current.Add(new IEElement(browser, startfrom)); } for (var i = startIndex; i < selectors.Count; i++) { var s = new IESelectorItem(selectors[i]); var elements = new List <IEElement>(); elements.AddRange(current); current.Clear(); int failcounter = 0; do { foreach (var _element in elements) { MSHTML.IHTMLElement[] matches; if (frameTags.Contains(_element.TagName.ToUpper())) { if (s.tagName.ToUpper() == "HTML") { i++; s = new IESelectorItem(selectors[i]); } var _f = _element.RawElement as MSHTML.HTMLFrameElement; MSHTML.DispHTMLDocument doc = (MSHTML.DispHTMLDocument)((SHDocVw.IWebBrowser2)_f).Document; var _doc = doc.documentElement as MSHTML.IHTMLElement; matches = ((IESelectorItem)s).matches(_doc); browser.elementx += _f.offsetLeft; browser.elementy += _f.offsetTop; browser.frameoffsetx += _f.offsetLeft; browser.frameoffsety += _f.offsetTop; } else { matches = ((IESelectorItem)s).matches(_element.RawElement); } var uimatches = new List <IEElement>(); foreach (var m in matches) { var ui = new IEElement(browser, m); uimatches.Add(ui); } current.AddRange(uimatches.ToArray()); Log.Selector("add " + uimatches.Count + " matches to current"); } if (current.Count == 0) { ++failcounter; string message = string.Format("Failer # " + failcounter + " finding any hits for selector # " + i + " {0:mm\\:ss\\.fff}", sw.Elapsed) + "\n"; message += "lookin for \n" + s.ToString() + "\n"; foreach (var _element in elements) { MSHTML.IHTMLElementCollection children = (MSHTML.IHTMLElementCollection)_element.RawElement.children; foreach (MSHTML.IHTMLElement elementNode in children) { var ui = new IEElement(browser, elementNode); message += ui.ToString() + "\n"; } var matches = ((IESelectorItem)s).matches(_element.RawElement); } Log.Selector(message); } else { Log.Selector(string.Format("Found " + current.Count + " hits for selector # " + i + " {0:mm\\:ss\\.fff}", sw.Elapsed)); } } while (failcounter < 2 && current.Count == 0); if (i == (selectors.Count - 1)) { result = current.ToArray(); } if (current.Count == 0 && Config.local.log_selector) { var message = "needed to find " + Environment.NewLine + selectors[i].ToString() + Environment.NewLine + "but found only: " + Environment.NewLine; foreach (var element in elements) { MSHTML.IHTMLElementCollection children = (MSHTML.IHTMLElementCollection)element.RawElement.children; foreach (MSHTML.IHTMLElement c in children) { try { // message += automationutil.getSelector(c, (i == selectors.Count - 1)) + Environment.NewLine; } catch (Exception) { } } } Log.Selector(message); return(new IEElement[] { }); } } if (result == null) { return new IEElement[] { } } ; Log.Selector(string.Format("GetElementsWithuiSelector::end {0:mm\\:ss\\.fff}", sw.Elapsed)); return(result); } }