public IEElement(Browser browser, MSHTML.IHTMLElement Element) { Browser = browser; RawElement = Element; className = Element.className; id = Element.id; tagName = Element.tagName.ToLower(); if (tagName == "input") { MSHTML.IHTMLInputElement inputelement = Element as MSHTML.IHTMLInputElement; type = inputelement.type.ToLower(); } try { MSHTML.IHTMLUniqueName id = RawElement as MSHTML.IHTMLUniqueName; uniqueID = id.uniqueID; } catch (Exception) { } IndexInParent = -1; if (Element.parentElement != null && !string.IsNullOrEmpty(uniqueID)) { MSHTML.IHTMLElementCollection children = Element.parentElement.children; for (int i = 0; i < children.length; i++) { MSHTML.IHTMLUniqueName id = children.item(i) as MSHTML.IHTMLUniqueName; if (id != null && id.uniqueID == uniqueID) { IndexInParent = i; break; } } } }
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)); }
public static string getXPath(MSHTML.IHTMLElement element, MSHTML.IHTMLElement parent) { if (element == null) { return(""); } MSHTML.IHTMLElement currentNode = element; ArrayList path = new ArrayList(); while (currentNode != null) { string pe = getNode(currentNode); if (pe != null) { path.Add(pe); // if (pe.IndexOf("@id") != -1) if (pe.StartsWith("/")) { break; } } currentNode = currentNode.parentElement; if (parent != null && GetUniqueID(parent) == GetUniqueID(currentNode)) { break; } } path.Reverse(); return(join(path, "/")); }
private static ObjectPropertyForElement setObjectProperties(MSHTML.IHTMLElement element, ObjectPropertyForElement data) { Util.deghlightElement(previousElement); previousElement = element; Util.highlightElement(element); data.page = new Page(); data.page.title = getTitle(); data.prop = CognizantITSObject.getProperties(element); data.frame = getFrameData(element); return(data); }
private static string getNode(MSHTML.IHTMLElement node) { string nodeExpr = node.tagName; if (nodeExpr == null) // Eg. node = #text { return(null); } if (node.id != "" && node.id != null) { nodeExpr += "[@id='" + node.id + "']"; // We don't really need to go back up to //HTML, since IDs are supposed // to be unique, so they are a good starting point. return("/" + nodeExpr); } // Find rank of node among its type in the parent int rank = 1; MSHTML.IHTMLDOMNode nodeDom = node as MSHTML.IHTMLDOMNode; MSHTML.IHTMLDOMNode psDom = nodeDom.previousSibling; MSHTML.IHTMLElement ps = psDom as MSHTML.IHTMLElement; while (ps != null) { if (ps.tagName == node.tagName) { rank++; } psDom = psDom.previousSibling; ps = psDom as MSHTML.IHTMLElement; } if (rank > 1) { nodeExpr += "[" + rank + "]"; } else { // First node of its kind at this level. Are there any others? MSHTML.IHTMLDOMNode nsDom = nodeDom.nextSibling; MSHTML.IHTMLElement ns = nsDom as MSHTML.IHTMLElement; while (ns != null) { if (ns.tagName == node.tagName) { // Yes, mark it as being the first one nodeExpr += "[1]"; break; } nsDom = nsDom.nextSibling; ns = nsDom as MSHTML.IHTMLElement; } } return(nodeExpr); }
internal static void sendSpiedObject(MSHTML.IHTMLElement element) { try { SpyObject sObject = new SpyObject(); setObjectProperties(element, sObject); WebSocketClient.send(sObject.ToString()); } catch (Exception ex) { Util.showNotification(ex.ToString()); } }
internal static void sendSpiedObjectToSave(MSHTML.IHTMLElement element) { try { SpySaveObject sObject = new SpySaveObject(); setObjectProperties(element, sObject); sObject.objectname = CognizantITSObject.getObjectName(element, sObject.prop); WebSocketClient.send(sObject.ToString()); } catch (Exception ex) { Util.showNotification(ex.ToString()); } }
public IEElement(Browser browser, MSHTML.IHTMLElement Element) { Browser = browser; RawElement = Element; ClassName = Element.className; Id = Element.id; TagName = Element.tagName.ToLower(); Name = ""; try { if (!(RawElement.getAttribute("Name") is System.DBNull)) { Name = (string)RawElement.getAttribute("Name"); } } catch (Exception) { } if (TagName == "option") { var option = Element as MSHTML.IHTMLOptionElement; Name = option.text; } if (TagName == "input") { MSHTML.IHTMLInputElement inputelement = Element as MSHTML.IHTMLInputElement; Type = inputelement.type.ToLower(); } try { MSHTML.IHTMLUniqueName id = RawElement as MSHTML.IHTMLUniqueName; UniqueID = id.uniqueID; } catch (Exception) { } IndexInParent = -1; if (Element.parentElement != null && !string.IsNullOrEmpty(UniqueID)) { MSHTML.IHTMLElementCollection children = (MSHTML.IHTMLElementCollection)Element.parentElement.children; for (int i = 0; i < children.length; i++) { if (children.item(i) is MSHTML.IHTMLUniqueName id && id.uniqueID == UniqueID) { IndexInParent = i; break; } } } }
internal static void sendRecordedObject(MSHTML.IHTMLElement element, String method) { try { RecordObjectElement rObject = new RecordObjectElement(); rObject.method = method; setObjectProperties(element, rObject); rObject.objectname = CognizantITSObject.getObjectName(element, rObject.prop); WebSocketClient.send(rObject.ToString()); } catch (Exception ex) { Util.showNotification(ex.ToString()); } }
private void traverseNodes(MSHTML.IHTMLElement parentNode, ref string cont) { if (parentNode.innerText != null) { cont += parentNode.innerText; } MSHTML.IHTMLElementCollection nodes = (MSHTML.IHTMLElementCollection)parentNode.children; IEnumerator ienum = nodes.GetEnumerator(); while (ienum.MoveNext()) { MSHTML.IHTMLElement node = (MSHTML.IHTMLElement)ienum.Current; traverseNodes(node, ref cont); } }
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)); }
public static bool IsPlaceholder(MSHTML.IHTMLElement element, bool atomic = false) { if (element == null) { return(false); } if (!element.tagName.Equals(PlaceHolderTag, StringComparison.InvariantCultureIgnoreCase)) { return(false); } if (!atomic) { return(true); } var result = element.getAttribute(AtomicAttribute); return((result != null) && result.ToString().Equals("true", StringComparison.InvariantCultureIgnoreCase)); }
// https://stackoverflow.com/questions/28009093/how-to-using-xpath-in-webbrowser-control // https://github.com/mradosta/thousandpass/blob/master/addons/msie/1000Pass_com/1000pass_com/XPath.cs public static string getXPath(this MSHTML.IHTMLElement element) { if (element == null) { return(""); } MSHTML.IHTMLElement currentNode = element; ArrayList path = new ArrayList(); while (currentNode != null) { string pe = getNode(currentNode); if (pe != null) { path.Add(pe); //if (pe.IndexOf("@id") != -1) // break; // Found an ID, no need to go upper, absolute path is OK } currentNode = currentNode.parentElement; } path.Reverse(); return(join(path, "/")); }
private static string getNode(MSHTML.IHTMLElement node) { string nodeExpr = node.tagName.ToLower(); if (nodeExpr == null) // Eg. node = #text { return(null); } var ngreflectname = node.getAttribute("ng-reflect-name") as string; if (!string.IsNullOrEmpty(ngreflectname) && nodeExpr == "input") { nodeExpr += "[@ng-reflect-name='" + ngreflectname + "']"; return("/" + nodeExpr); } if (node.id != "" && node.id != null) { nodeExpr += "[@id='" + node.id + "']"; return("/" + nodeExpr); } var name = node.getAttribute("name") as string; if (!string.IsNullOrEmpty(name) && nodeExpr == "input") { nodeExpr += "[@name='" + name + "']"; return("/" + nodeExpr); } // Find rank of node among its type in the parent int rank = 1; MSHTML.IHTMLDOMNode nodeDom = node as MSHTML.IHTMLDOMNode; MSHTML.IHTMLDOMNode psDom = nodeDom.previousSibling; MSHTML.IHTMLElement ps = psDom as MSHTML.IHTMLElement; while (ps != null) { if (ps.tagName == node.tagName) { rank++; } psDom = psDom.previousSibling; ps = psDom as MSHTML.IHTMLElement; } if (rank > 1) { nodeExpr += "[" + rank + "]"; } else { // First node of its kind at this level. Are there any others? MSHTML.IHTMLDOMNode nsDom = nodeDom.nextSibling; MSHTML.IHTMLElement ns = nsDom as MSHTML.IHTMLElement; while (ns != null) { if (ns.tagName == node.tagName) { // Yes, mark it as being the first one nodeExpr += "[1]"; break; } nsDom = nsDom.nextSibling; ns = nsDom as MSHTML.IHTMLElement; } } return(nodeExpr); }
public static string GetUniqueID(MSHTML.IHTMLElement RawElement) { MSHTML.IHTMLUniqueName id = RawElement as MSHTML.IHTMLUniqueName; return(id.uniqueID); }
private static String getFrameData(MSHTML.IHTMLElement element) { return(Util.getFrameName(element)); }
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); } }