コード例 #1
0
 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;
             }
         }
     }
 }
コード例 #2
0
        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));
        }
コード例 #3
0
        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, "/"));
        }
コード例 #4
0
 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);
 }
コード例 #5
0
ファイル: Extensions.cs プロジェクト: sanser/carbuy
        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);
        }
コード例 #6
0
 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());
     }
 }
コード例 #7
0
 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());
     }
 }
コード例 #8
0
ファイル: IEElement.cs プロジェクト: owenwdx/openrpa
 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;
             }
         }
     }
 }
コード例 #9
0
 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());
     }
 }
コード例 #10
0
ファイル: Form1.cs プロジェクト: alansif/ah_bp
        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);
            }
        }
コード例 #11
0
        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));
        }
コード例 #12
0
        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));
        }
コード例 #13
0
ファイル: Extensions.cs プロジェクト: sanser/carbuy
        // 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, "/"));
        }
コード例 #14
0
        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);
        }
コード例 #15
0
 public static string GetUniqueID(MSHTML.IHTMLElement RawElement)
 {
     MSHTML.IHTMLUniqueName id = RawElement as MSHTML.IHTMLUniqueName;
     return(id.uniqueID);
 }
コード例 #16
0
 private static String getFrameData(MSHTML.IHTMLElement element)
 {
     return(Util.getFrameName(element));
 }
コード例 #17
0
        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);
        }
    }