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; }
protected string MappedXmlNodePath(HtmlElementWrapper testElement) { XmlDocument doc = XmlHlp.HtmlDocFromNavigable(WebExtractorHlp.LoadHtmlCode(WebExtractorHlp.DocumentText(Browser))); return Map.GetXmlNode(doc, testElement); }