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?

War es hilfreich?

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.

Nun werden die Bookmarklet Versionen (dank href="http://subsimple.com/bookmarklets/jsbuilder.htm" rel="noreferrer" title="Bookmarklet Builder"> Bookmarklet Builder

IE
(Ich hatte es in zwei Teile zu brechen, weil IE nicht mag sehr lange Bookmarklets (max Größe variiert je nach IE-Versionen!). Sie haben die erste (Funktion def), dann die zweite aktivieren. Getestet mit IE6. )

javascript:function getNode(node){var nodeExpr=node.tagName;if(!nodeExpr)return null;if(node.id!=''){nodeExpr+="[@id='"+node.id+"']";return "/"+nodeExpr;}var rank=1;var ps=node.previousSibling;while(ps){if(ps.tagName==node.tagName){rank++;}ps=ps.previousSibling;}if(rank>1){nodeExpr+='['+rank+']';}else{var ns=node.nextSibling;while(ns){if(ns.tagName==node.tagName){nodeExpr+='[1]';break;}ns=ns.nextSibling;}}return nodeExpr;}
javascript:function o__o(){var currentNode=document.selection.createRange().parentElement();var path=[];while(currentNode){var pe=getNode(currentNode);if(pe){path.push(pe);if(pe.indexOf('@id')!=-1)break;}currentNode=currentNode.parentNode;}var xpath="/"+path.reverse().join('/');clipboardData.setData("Text", xpath);}o__o();

FF

javascript:function o__o(){function getNode(node){var nodeExpr=node.tagName;if(nodeExpr==null)return null;if(node.id!=''){nodeExpr+="[@id='"+node.id+"']";return "/"+nodeExpr;}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{var ns=node.nextSibling;while(ns!=null){if(ns.tagName==node.tagName){nodeExpr+='[1]';break;}ns=ns.nextSibling;}}return nodeExpr;}var currentNode=window.getSelection().anchorNode;if(currentNode==null){alert("No selection");return;}var path=[];while(currentNode!=undefined){var pe=getNode(currentNode);if(pe!=null){path.push(pe);if(pe.indexOf('@id')!=-1)break;}currentNode=currentNode.parentNode;}var xpath="/"+path.reverse().join('/');alert(xpath);}o__o();

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.

haben sollte Hinweis

, 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;
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top