Äquivalent von Firebug „Copy XPath“ im Internet Explorer?
-
03-07-2019 - |
Frage
Ich habe ein Internet Explorer nur Web-Anwendung.
Ich erforsche, was wir tun, um die Tests zu automatisieren.
Selen sieht aus wie ein gutes Werkzeug, aber in der Lage sein, Links zu aktivieren usw. Ich muß ihm sagen, wo sie sind. Die Anwendung wurde nicht mit dieser Art von Tests im Auge gebaut, so dass es in der Regel nicht id
Attribute auf den Schlüsselelementen.
Kein Problem, ich denke, ich kann XPath-Ausdrücke verwenden. Aber die richtige XPath findet für, sagen sie, eine Schaltfläche, ist ein königlicher Schmerz durch Überprüfen der Quelle der Seite getan, wenn.
Mit Firefox / Firebug, ich kann wählen das Element dann "Copy XPath" verwenden den Ausdruck zu erhalten.
Ich habe den IE Developer Toolbar und es ist frustrierend schließen. Ich kann Sie auf das Element von Interesse wählen und alle Arten von Informationen über sie anzuzeigen. aber ich kann nicht sehen, jede geeignete Weise, die XPath der Bestimmung für sie.
So ist es eine Möglichkeit, dies mit IE zu tun?
Lösung
würde ich Bookmarklets verwenden. Ich habe eine XPath verwandt, aber ich weiß nicht, ob es in IE funktioniert. Ich muss gehen, aber ich werde es testen und geben Sie es, wenn es auf IE funktioniert.
Zwei Bookmarklet Websites für Web-Entwickler von meinen Lesezeichen: Subsimple des Bookmarklets und des Bookmarklets Quadratfreie. Viele nützliche Dinge gibt ...
[EDIT] OK, ich bin zurück. Das Bookmarklet Ich war nur für FF hatte, und war nicht optimal. Ich schrieb es schließlich, wenn auch Ideen aus dem Original verwenden. Kann nicht finden wieder da, wo ich es gefunden.
Expanded JS:
function getNode(node)
{
var nodeExpr = node.tagName;
if (nodeExpr == null) // Eg. node = #text
return null;
if (node.id != '')
{
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;
}
// We don't really need this
//~ if (node.className != '')
//~ {
//~ nodeExpr += "[@class='" + node.className + "']";
//~ }
// Find rank of node among its type in the parent
var rank = 1;
var ps = node.previousSibling;
while (ps != null)
{
if (ps.tagName == node.tagName)
{
rank++;
}
ps = ps.previousSibling;
}
if (rank > 1)
{
nodeExpr += '[' + rank + ']';
}
else
{
// First node of its kind at this level. Are there any others?
var ns = node.nextSibling;
while (ns != null)
{
if (ns.tagName == node.tagName)
{
// Yes, mark it as being the first one
nodeExpr += '[1]';
break;
}
ns = ns.nextSibling;
}
}
return nodeExpr;
}
var currentNode;
// Standard (?)
if (window.getSelection != undefined)
currentNode = window.getSelection().anchorNode;
// IE (if no selection, that's BODY)
else
currentNode = document.selection.createRange().parentElement();
if (currentNode == null)
{
alert("No selection");
return;
}
var path = [];
// Walk up the Dom
while (currentNode != undefined)
{
var pe = getNode(currentNode);
if (pe != null)
{
path.push(pe);
if (pe.indexOf('@id') != -1)
break; // Found an ID, no need to go upper, absolute path is OK
}
currentNode = currentNode.parentNode;
}
var xpath = "/" + path.reverse().join('/');
alert(xpath);
// Copy to clipboard
// IE
if (window.clipboardData) clipboardData.setData("Text", xpath);
// FF's code to handle clipboard is much more complex
// and might need to change prefs to allow changing the clipboard content.
// I omit it here as it isn't part of the original request.
Sie haben das Element auswählen und das Bookmarklet aktivieren, um seine XPath zu erhalten.
Andere Tipps
Seit Bookmarklet Verwendung Paul verwirrt, dachte ich, sollte ich eine kleine Einführung zu ihrer Verwendung hinzufügen. Ich mache es in einer separaten Nachricht Misch Sachen zu vermeiden.
Bookmarklets (auch genannt favlets) sind wenig JavaScript-Skripten (sic) zum Einfügen in der Adressleiste des Browsers eingefügt zu werden (wie jede andere URL) und somit auf der aktuellen Seite zu laufen.
Nach dem Ausführen es (Paste, Enter drücken), können Sie ihn mit einem Lesezeichen für die Wiederverwendung (fügen Sie es zu den Favoriten in IE). Beachten Sie, dass der Browser könnte die ursprüngliche URL Lesezeichen stattdessen Sie haben dann das Lesezeichen zu bearbeiten und die URL mit Ihrem Skript ersetzen.
Natürlich können Sie es in die URL-Leiste für den schnellen Zugriff hinzufügen.
Diese Skripte wirken wie ein Teil der aktuellen Seite zu sein, den Zugriff auf globale JS Variablen und Funktionen, Dom Objekte usw.
Sie können super einfach sein, wie die Samen javascript: alert("Hello world!");
oder ziemlich komplex wie die oben. Wenn es einen Wert zurückgibt (oder wenn im letzten Ausdruck einen Wert hat), ersetzt der Wert der aktuellen Seite. Um dies zu vermeiden, können Sie das Skript mit alert
beenden (zum Anzeigen eines Ergebnisses) oder wickeln Sie das Skript in einer Funktionsdefinition und rufen Sie diese Funktion, wie ich oben tat. (Einige auch setzen void (0);. Am Ende, aber ich sah es als schlechte Praxis gesehen wird)
Die Funktion Lösung hat den Vorteil, alle Variablen des Skripts lokal auf das Applet zu machen (wenn mit var
erklärt, natürlich), Störungen / Nebenwirkungen mit Skripten auf der lokalen Seite zu vermeiden. Deshalb auch die Wickelfunktion einen Namen mit einem lokalen Skript unwahrscheinlich kollidieren.
, dass einige Browser (sprich: „IE“), um die Größe von favlets begrenzen können, die max. Länge mit Version variiert (Tendenz zu verringern). Deshalb werden alle nutzlos Leerzeichen entfernt wird (der bookmarlet Builder oben verbunden ist gut für das) und ich entfernte die explict Vergleiche mit null und undefined ich in der Regel tun. Ich hatte auch die favlet in zwei, ersten Teil der Definition eine Funktion zu spalten (leben, solange die Seite nicht geändert / aktualisiert), zweiten Teil mit ihm.
Nützliches Werkzeug, insbesondere auf Browser nicht vom Benutzer Skripte erlaubt (à la Grease) oder ohne diese Erweiterung.
Ich habe das Bookmarklet-Code in C # neu geschrieben, so dass, wenn Sie es nützlich finden, verwenden Sie es; -)
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace Anotation.Toolbar
{
class XPath
{
public static string getXPath(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 join(ArrayList items, string delimiter)
{
StringBuilder sb = new StringBuilder();
foreach (object item in items)
{
if (item == null)
continue;
sb.Append(delimiter);
sb.Append(item);
}
return sb.ToString();
}
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;
}
}
}