2010-09-15 16 views
3

Je suis d'essayer d'utiliser le moteur de sélection Sizzle jQuery comme Sélénium personnalisé localiser API, comme dans cet article: http://johnjianfang.blogspot.com/2009/04/how-to-use-jquery-to-create-custom.htmlcomportement étrange lors de l'application méthode Array.prototype.slice pour résultat de querySelectorAll

Unfortunatly, quand j'utilise selenium.click('jquery=a.mylink') , Rien ne se passe.

selenium.click('css=a.mylink') fonctionne parfaitement. J'ai fait un peu de recherche, et a trouvé que le problème est dans la façon dont jQuery convertit le résultat de l'API querySelectorAll. Voici l'extrait de jQuery 1.4.2:

Sizzle = function(query, context, extra, seed){ 
    context = context || document; 

    // Only use querySelectorAll on non-XML documents 
    // (ID selectors don't work in non-HTML documents) 
    if (!seed && context.nodeType === 9 && !isXML(context)) { 
     try { 
      return makeArray(context.querySelectorAll(query), extra); 
     } catch(e){} 
    } 

    return oldSizzle(query, context, extra, seed); 
}; 


var makeArray = function(array, results) { 
    array = Array.prototype.slice.call(array, 0); 

    if (results) { 
     results.push.apply(results, array); 
     return results; 
    } 

    return array; 
}; 

Quand je change makeArray comme ceci:

var makeArray = function(arrayLikeObject, results) { 

    var array = new Array(arrayLikeObject.length); 
    for (var i = 0, n = arrayLikeObject.length; i < n; i++) { 
     array[i] = arrayLikeObject[i]; 
    } 

    if (results) { 
     results.push.apply(results, array); 
     return results; 
    } 

    return array; 
}; 

Il permet de résoudre ce problème étrange.

Des idées pour lesquelles ce correctif fonctionne?!

+0

Qu'en est-'ARRAYA [0] === arrayB [0]'? – palswim

+0

true, pair pour (var p dans tableauA [0]) { if (arrayA [0] [p]! == arrayB [0] [p]) { alert ('diff'); } } never alerts :) –

+0

Dans quels navigateurs avez-vous testé? –

Répondre

1

Le navigateur peut ne pas être en mesure de convertir un nodeList en tableau en utilisant des méthodes intégrées. Votre fallback est presque exactement comme celui inclus plus bas dans le jQuery 1.4.2 source:

// Perform a simple check to determine if the browser is capable of 
// converting a NodeList to an array using builtin methods. 
// Also verifies that the returned array holds DOM nodes 
// (which is not the case in the Blackberry browser) 
try { 
    Array.prototype.slice.call(document.documentElement.childNodes, 0)[0].nodeType; 

// Provide a fallback method if it does not work 
} catch(e){ 
    makeArray = function(array, results) { 
     var ret = results || []; 

     if (toString.call(array) === "[object Array]") { 
      Array.prototype.push.apply(ret, array); 
     } else { 
      if (typeof array.length === "number") { 
       for (var i = 0, l = array.length; i < l; i++) { 
        ret.push(array[i]); 
       } 
      } else { 
       for (var i = 0; array[i]; i++) { 
        ret.push(array[i]); 
       } 
      } 
     } 

     return ret; 
    }; 
}