2011-07-14 3 views
1

Je lutte contre ce problème toute la journée mais sans aucun résultat. J'utilise WebDriver de sélénium et que vous souhaitez obtenir deux chaînes par XPath:Problème avec la requête XPath dans IE

<input id="FB_childRec1_0" type="hidden" value="child12_0,child22_0,child13_0,child23_0,child14_0,child24_0" size="1"/> 

et

<input id="FB_childRec4_0" type="hidden" value="child15_0,child25_0,child16_0,child26_0,child17_0,child27_0,child18_0,child28_0,child19_0" size="1"/> 

de ce code:

<tbody> 
    <input id="cidChild1_0" type="hidden" value="T3$PATENT$US7381548B220080603"/> 
    <input id="cidChild1_0" type="hidden" value="T3$PATENT$US7381548B220080603"/> 
    <tr id="FORWARD_1US7381548B220080603_0" class="alternate" style="" name="childTR"> 
     <td class="tborder leftAlignment" rowspan="1" style="width:1%"> 
     <td class="tborder leftAlignment vTop" rowspan="1" style="width:1%"> 
     <input id="FB_childRec1_0" type="hidden" value="child12_0,child22_0,child13_0,child23_0,child14_0,child24_0" size="1"/> 
     <td class="tborder leftAlignment vTop" rowspan="1" style="width:1%"> 
     <td class="frmData tborder vTop" align="left" rowspan="1" colspan="5">Forward Citation - (Displaying 3 forward citations)</td> 
    </tr> 
    <input id="cidChild4_0" type="hidden" value="T3$PATENT$US7381548B220080603"/> 
    <tr id="BACKWARD_4US7381548B220080603_0" class="alternate" style="" name="childTR"> 
     <td class="tborder leftAlignment" rowspan="1" style="width:1%"> 
     <td class="tborder leftAlignment vTop" rowspan="1" style="width:1%"> 
     <input id="FB_childRec4_0" type="hidden" value="child15_0,child25_0,child16_0,child26_0,child17_0,child27_0,child18_0,child28_0,child19_0" size="1"/> 
     <td class="tborder leftAlignment vTop" rowspan="1" style="width:1%"> 
     <td class="frmData tborder vTop" align="left" rowspan="1" colspan="5">Backward Citation - (Displaying 14 backward citations)</td> 
    </tr> 
</tbody> 

J'utilise cette requête XPath: //tbody/tr[@id[contains(.,'US7381548B2')]]//input

Dans le code, c'est:

driver.FindElements(By.XPath("//tbody/tr[@id[contains(.,'" + queryArray[i] + "')]]//input")); 

Tout fonctionne parfaitement dans firefox et je peux obtenir 2 éléments. Mais dans IE FindElements() ne trouve rien. Je l'ai essayé sur IE8 et IE9 sans aucun résultat. J'ai mis à jour Selenium WebDriver à 2.0.0 mais cela n'aide pas. Ensuite, je pense que l'application donne une source différente pour FF et IE. Donc, je sauve la page de IE et l'ouvre avec FF. Firepath me montre deux matchs, donc la source est la même.

Tout cela me fait penser que c'est un bug de sélénium, parce que je fais face à ce genre de problème pour la deuxième fois. Il y a beaucoup de sujets avec un problème similaire - les requêtes xpath fonctionnent dans FF mais ne fonctionnent pas dans IE. Mais je ne peux trouver aucune cause de cela. Qu'est-ce qui peut causer un tel comportement étrange du sélénium? Et que dois-je faire pour résoudre le problème?

Répondre

0

Essayez avec la double barre oblique avant l'entrée resplaced avec une seule barre oblique:

//tbody/tr[@id[contains(.,'US7381548B2')]]/input 

pourrait être le XPath ne l'aime pas?

+0

Oui, vous avez raison. J'ai ajouté le second slash essayant de faire fonctionner XPath et j'ai oublié de l'enlever. Mais avec une seule barre oblique, elle ne fonctionne pas non plus –

1

Il existe quelques différences dans la façon dont le DOM est configuré dans FF et IE, en particulier avec le tag tbody. Essayez de supprimer les tbody du XPath:

//tr[@id[contains(.,'US7381548B2')]]//input 

également, mis l'input dans un <td>.

+0

// tr [@id [contains (., 'US7381548B2')]]/entrée malheureusement, il ne fonctionne pas non plus. Mais je pense avoir trouvé la cause du problème. Conformément à l'étiquette d'entrée standard ne peut pas être mis directement dans TR. Donc, si je fais XPath analyse en deux étapes: 1. "//tbody/tr[@id[contains(.'US7381548B2")]] "2." // Entrée "Il résout le problème! –

+0

Vous n'avez pas besoin de deux étapes. Le seul XPath ci-dessus devrait fonctionner pour vous. –

0

IE8 prend en charge document.documentElement.contains(), mais pas document.contains().

Peut-être que cela est source de confusion à la fois pour le sélénium et l'interaction IE.

Essayez de définir la propriété allowNativeXpath() sur false.

0

Etape 1: Obtenir les localisateurs de la 2 Contrôles d'entrée

Locator pour FB_childRec1_0: Css = .alternate [id * = 'avant']> entrée [id * = 'FB_childRec']

Locator pour FB_childRec4_0: = .alternate css [id * = 'BACKWARD']> entrée [id * = 'FB_childRec']

donc, à partir locators Au-dessus Quel que les opérations peuvent être fait sera fait.