سؤال

ولدي تطبيقات الويب إنترنت إكسبلورر الوحيد.

وأنا استكشاف ما يمكننا القيام به لأتمتة الاختبار.

والسيلينيوم يشبه أداة جيدة، ولكن لتكون قادرة على تفعيل الروابط وما أنا بحاجة لمعرفة ما أين هم. لم يتم بناء التطبيق مع هذا النوع من التجارب في العقل، لذلك هناك عموما لا id السمات على العناصر الرئيسية.

ولا توجد مشكلة، وأعتقد، وأنا يمكن استخدام تعبيرات كسباث. لكن العثور على كسباث الصحيح، مثلا، زر، هو الألم الملكي في حال القيام به عن طريق فحص مصدر الصفحة.

ومع فايرفوكس / الحرائق، ويمكنني أن اختيار العنصر ثم استخدام "نسخ كسباث" للحصول على التعبير.

ولدي IE شريط أدوات المطور، وقريب محبط. استطيع ان اضغط لتحديد عنصر الفائدة وعرض جميع أنواع المعلومات حول هذا الموضوع. ولكن لا أستطيع أن أرى أي طريقة مريحة لتحديد كسباث لذلك.

وحتى لا يكون هناك أي طريقة للقيام بذلك مع IE؟

هل كانت مفيدة؟

المحلول

وأود أن استخدام أوامر المفضلة. لدي كسباث واحدة ذات الصلة، ولكن أنا لا أعرف ما اذا كان يعمل في IE. أنا فلدي الذهاب ولكنني لن اختبار وإعطائها ما اذا كان يعمل على IE.

وموقعين بووكمركلت لمطوري الويب من المواقع المفضلة: أوامر المفضلة Subsimple في و Squarefree في . الكثير من الأشياء المفيدة هناك ...

[تحرير] OK، أنا مرة أخرى. وكانت بووكمركلت كان لي لFF فقط، وكان لا المثلى. وأخيرا أعاد ذلك، على الرغم من استخدام الأفكار من نسخة أصلية واحدة. لا يمكن العثور على الظهر حيث وجدت ذلك.

و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.

لديك لتحديد عنصر وتفعيل بووكمركلت للحصول على كسباث لها.

والآن، إصدارات بووكمركلت (بفضل بووكمركلت باني ):

وIE
(كان لي لكسر في جزأين، لأن IE لا يحب أوامر المفضلة طويلة جدا (حجم أقصى يختلف باختلاف إصدارات IE!). لديك لتفعيل أول واحد (وظيفة صفر) ثم ثانية واحدة. اختبار مع 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();

نصائح أخرى

ومنذ استخدام بووكمركلت حيرة بول، على الرغم من أنني يجب إضافة القليل مقدمة لاستخدامها. أفعل ذلك في رسالة منفصلة لتجنب خلط الاشياء.

وتطبيقات مختصرة (وتسمى أيضا favlets) هي صغيرة مخطوطات جافا سكريبت (كذا) مصممة للصقها في شريط عنوان المتصفح (مثل أي URL الأخرى) وبالتالي تعمل على الصفحة الحالية.
بعد تشغيله (لصق، هاهنا)، يمكنك وضع إشارة عليه للإعادة (إضافته إلى المفضلة في IE). لاحظ أن المتصفح قد المرجعية URL الأصلي بدلا من ذلك، لديك ثم لتحرير المرجعية واستبدال URL مع السيناريو الخاص بك.
بالطبع، يمكنك إضافته إلى شريط URL للوصول السريع للغاية.

وهذه البرامج النصية تعمل مثل كونها جزءا من الصفحة الحالية، والوصول إلى المتغيرات العالمية JS وظائف، والأشياء دوم، الخ
ويمكن أن تكون بسيطة عظمى، مثل javascript: alert("Hello world!"); المنوي أو معقدة تماما مثل واحد أعلاه. إذا كان بإرجاع قيمة (أو إذا التعبير الأخير له قيمة)، وقيمة استبدال الصفحة الحالية. ولتجنب ذلك، يمكنك إنهاء البرنامج النصي مع alert (لعرض نتيجة) أو التفاف البرنامج النصي في تعريف الدالة واستدعاء هذه الدالة، كما فعلت أعلاه. (بعض الفراغ وضعت أيضا (0)؛ في نهاية المطاف، ولكن رأيت ينظر اليها على انها ممارسة سيئة)

والحل وظيفة لديه ميزة لجعل جميع المتغيرات من السيناريو المحلية إلى التطبيق الصغير (إذا أعلن مع var، وبطبيعة الحال)، وتجنب التدخلات / آثار جانبية مع البرامج النصية على صفحات محلية. وهذا أيضا لماذا يجب أن يكون وظيفة التفاف اسم المرجح أن تصطدم مع السيناريو المحلي.

لاحظ أن بعض المتصفحات (اقرأ: "IE") يمكن أن تحد من حجم favlets، وكحد أقصى. طول متفاوتة مع إصدار (تميل إلى الانخفاض). لهذا السبب تتم إزالة كافة بيضاء عديمة الفائدة (باني bookmarlet مرتبطة أعلاه هو جيد لذلك) وأزلت مقارنات explict مع لاغية وغير معرفة أفعل عادة. كما أتيحت لي لتقسيم favlet إلى قسمين، الجزء الأول تحديد وظيفة (الذين يعيشون طالما أن الصفحة لا يتم تغيير / منتعشة)، الجزء الثاني استخدامه.

وأداة مفيدة، ولا سيما على متصفحات عدم السماح مخطوطات المستخدم (à لا غرسمونكي) أو دون هذا التمديد.

ولقد إعادة كتابة رمز بووكمركلت إلى C #، لذلك إذا كنت سوف تجد أنه من المفيد، واستخدامها؛ -)

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;
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top