public void SelectSingleNode()
        {
            Init("<html><body><table><tr><td>1</td><td id=\"toTest\">2</td></table></body></html>");

              HtmlElementWrapper body = new HtmlElementWrapper(Browser.Document.Body);

              Assert.AreEqual(GetElementById("toTest"), body.SelectSingleNode("table[1]/tbody[1]/tr[1]/td[2]"));
              Assert.AreEqual(null, body.SelectSingleNode("table[1]/tbody[1]/tr[2]"));
        }
 public string GetXmlNode(XmlDocument document, HtmlElementWrapper elem)
 {
     if (elem.Element != null && elem.Element.Document != null)
       {
     if (CacheNotValid(document, elem.Element.Document))
       ClearCache(document, elem.Element.Document);
     return GetXmlNode_Inner(elem);
       }
       else
     return string.Empty;
 }
        private string GetXmlNode_Inner(HtmlElementWrapper element)
        {
            if (element != null)
              {
            if (!xmlNodesCache.ContainsKey(element))
            {
              xmlNodesCache[element] = XmlHlp2.GetPath(XmlHlp.SelectSingleNode(cachedXml, element.Path));

              if (false)
              {
            if (element.Parent != null)
            {
              string parentPath = GetXmlNode_Inner(element.Parent);
              XmlNode xmlParent = XmlHlp.SelectSingleNode(cachedXml, parentPath);
              if (xmlParent != null)
              {
                string subPath = element.Path.Substring(element.Path.LastIndexOf('/') + 1);
                XmlNode child = xmlParent.SelectSingleNode(subPath);
                if (child != null)
                {
                  xmlNodesCache[element] = XmlHlp.GetPath(child);
                  htmlNodesCache[XmlHlp.GetPath(child)] = element;
                }
                else if (element.Parent.Children.Count == 1)
                  xmlNodesCache[element] = parentPath;
                else
                  xmlNodesCache[element] = null;
              }
              else
                xmlNodesCache[element] = null;
            }
            else if (WebExtractorHlp.TagsAreSame(element.Name, "html") &&
              XmlHlp.SelectSingleNode(cachedXml, "/html[1]") != null)
            {
              xmlNodesCache[element] = "/html[1]";
              htmlNodesCache["/html[1]"] = element;
            }
            else
              xmlNodesCache[element] = null;
              }
            }
            return xmlNodesCache[element];
              }
              return string.Empty;
        }
        private List<HtmlElementWrapper> GetSelectedElements()
        {
            if (GetModel().Mode == Model.WorkMode.Browse)
              {
            cachedSelectedNode = null;
            cachedSelectedElementWrapper = null;
              }
              else if (Browser.ReadyState == WebBrowserReadyState.Complete)
              //if (GetModel().SelectedNode != cachedSelectedNode)
              {
            cachedSelectedNode = GetModel().GetSelectedNode(GetModel().ActivePosition);
            XmlNode node = XmlHlp.SelectSingleNode(GetModel().ActivePosition.XmlDocument, cachedSelectedNode);
            cachedSelectedElementWrapper = map.GetHtmlElement(Browser, node);
              }

              List<HtmlElementWrapper> result = new List<HtmlElementWrapper>();
              if (cachedSelectedElementWrapper != null)
            result.Add(cachedSelectedElementWrapper);
              return result;
        }
        public void ForceSyncronize()
        {
            if (!browser.IsBusy)
              {
            if (browser.Url != cachedBrowserUri)
            {
              Clear();
              cachedBrowserUri = browser.Url;
            }

            List<HtmlElementWrapper> allElements = new List<HtmlElementWrapper>();
            foreach (string style in Links.Keys)
            {
              List<HtmlElementWrapper> elements = Links[style]();
              allElements.AddRange(elements);
              if (elements != null)
              {
            foreach (HtmlElementWrapper element in elements)
            {
              //if (!styles.ContainsKey(element))
              //{
              //  string myStyle = ";FILTER: progid:DXImageTransform.Microsoft.Alpha(opacity=90);BACKGROUND-COLOR: #ff0000";
              //  //string myStyle = "border-color:red;border-style:dashed;border-width:5;margin:-5;";//margin:-5;
              //  styles[element] = element.Element.Style;
              //  element.Element.Style = (styles[element] ?? "") + myStyle;
              //  //style + "z-index:1000";
              //}
              if (element.Element.Document != null && element.Element.Document.Body != null)
              {
                if (!divDict.ContainsKey(element))
                {
                  FlowHlp.SafeBlock("Создание подсвечивающих div-ов на события", delegate
                  {
                    HtmlElementWrapper newDiv = new HtmlElementWrapper(element.Element.Document.Body).CreateChild("div");
                    newDiv.Element.MouseDown += new HtmlElementEventHandler(Element_MouseDown);
                    divDict[element] = newDiv;
                  });
                }
                HtmlElementWrapper div = divDict[element];
                string divStyle = style;
                divStyle += ";position:absolute;left:{0}px;top:{1}px;width:{2}px;height:{3}px;";// z-index:-1000;";
                Rectangle rect = element.AbsoluteRectangle;
                divStyle = string.Format(divStyle, rect.Left, rect.Top, rect.Width, rect.Height);
                div.Element.Style = divStyle;
              }
            }
              }
            }

            Getter<HtmlElementWrapper, HtmlElementWrapper> one = delegate(HtmlElementWrapper w) { return w; };
            CollectionSynchronizer.CompareResults<HtmlElementWrapper, HtmlElementWrapper> compareResults =
            CollectionSynchronizer.Compare<HtmlElementWrapper, HtmlElementWrapper, HtmlElementWrapper>(allElements, one, divDict.Keys, one);
            //CollectionSynchronizer.Compare<HtmlElementWrapper, HtmlElementWrapper, HtmlElementWrapper>(allElements, one, styles.Keys, one);
            foreach (HtmlElementWrapper elementToHide in compareResults.OnlyRight)
            {
              //elementToHide.Element.Style = styles[elementToHide];
              //styles.Remove(elementToHide);

              //divDict[elementToHide].Element.MouseDown -= Element_MouseDown;
              divDict[elementToHide].DeleteSelf();
              divDict.Remove(elementToHide);
            }
              }
        }
 private HtmlElementWrapper GetParent()
 {
     HtmlElement element = Element;
       if (element.Parent != null)
       {
     HtmlElementWrapper parent = new HtmlElementWrapper(element.Parent);
     int guard = 0;
     foreach (HtmlElementWrapper wrapper in TreeCollectionHlp.WideVisit(parent, delegate(HtmlElementWrapper w) { return w.Children; }))
     {
       guard++;
       if (guard > 15)
     break;
       if (wrapper.Children.Contains(this))
     return wrapper;
     }
     return new HtmlElementWrapper(element.Parent);
       }
       return null;
 }
        private static HtmlElementWrapper GoDeepThrowAlienTags(HtmlElementWrapper parent, string nodeName)
        {
            List<HtmlElementWrapper> children = parent.Children;

              while (children.Count == 1 && !WebExtractorHlp.TagsAreSame(children[0].Name, nodeName))
              {
            parent = children[0];
            children = parent.Children;
              }
              return parent;
        }
        public static HtmlElementWrapper SelectHtmlNode(HtmlDocument htmlDocument, string resultPath)
        {
            if (htmlDocument != null && resultPath != null && htmlDocument.Body != null && htmlDocument.Body.Parent != null)
              {
            string[] parts = resultPath.Split('/');
            int currentIndex = 1;
            if (currentIndex < parts.Length && parts[currentIndex] == "HTML[1]")
            {
              currentIndex++;
              HtmlElement html = htmlDocument.Body.Parent;
              while (html.Parent != null)
            html = html.Parent;
              HtmlElementWrapper current = new HtmlElementWrapper(html);

              while (currentIndex < parts.Length)
              {
            bool found = false;
            foreach (HtmlElementWrapper child in current.Children)
            {
              if (string.Format("{0}[{1}]", child.Name, child.IndexToParent) == parts[currentIndex])
              {
                current = child;
                found = true;
                break;
              }
            }
            if (!found)
              return null;
            currentIndex++;
              }
              return current;
            }
            else
              return null;

              }
              else
            return null;
        }
Esempio n. 9
0
 protected string MappedXmlNodePath(HtmlElementWrapper testElement)
 {
     XmlDocument doc = XmlHlp.HtmlDocFromNavigable(WebExtractorHlp.LoadHtmlCode(WebExtractorHlp.DocumentText(Browser)));
       return Map.GetXmlNode(doc, testElement);
 }