2017-10-20 16 views
0

Je jure que j'ai cherché Google et SE pendant des heures et je ne pouvais pas trouver tout ce qui s'applique à mon cas.Comment cliquer sur un lien qui a été trouvé en utilisant un span défini dedans?

J'ai localisé mon lien en utilisant:

WebElement element = driver.findElement(By.linkText("News")); 

Ceci, cependant, ne retourne pas le lien (< a> tag), mais renvoie la durée d'une <> avec le linkText.

Voici comment la structure des liens ressemble:

<a href="________" itemprop="url" style="height: 88px; line-height: 88px;"> 
    <span class="avia-bullet"></span> 
    <span class="avia-menu-text">News</span> 
    <span class="avia-menu-fx"> 
     <span class="avia-arrow-wrap"> 
      <span class="avia-arrow"></span> 
     </span> 
    </span> 
    <span class="dropdown_available"></span> 
</a> 

Alors, quand je fais: element.click();, tout le navigateur va vers le bas avec "ElementNotInteractableException". Je pensais que cela pouvait prendre du temps, mais je lui ai donné beaucoup de temps et ça échoue toujours.
Je suppose que je ne peux pas simplement cliquer sur un < span>.

Mais comment faire référence à son parent (le < a>)?

J'ai essayé:

element=element.findElement(By.xpath("parent")); 
element=element.findElement(By.xpath("..")); 
+0

try element = élément.findElement (By.xpath ("./ ..")); './ 'dans xpath représente le noeud courant. Eh bien, cela ne fonctionnera pas parce que ce n'est pas le 'A' qui contient le test = News, c'est un 'Span' ... – yong

Répondre

0

Avec HTML complexe, les méthodes par défaut de Sélénium ne fonctionnera pas comme prévu.

Que diriez-vous d'essayer différentes méthodes de fonctions XPath:

Par exemple, essayez celui-ci:

driver.findElement(By.xpath("//a[contains(.,'News')]")).click(); 

Ce SO poste a plus de détails sur les autres fonctions de chemin: XPath contains(text(),'some string') doesn't work when used with node with more than one Text subnode

Vous
+0

Comment puis-je aller au parent de l'élément que vous avez trouvé avec votre réponse? – DraxDomax

+0

Nouvelles DraxDomax

+0

remplacé "texte()" par "." - Essayez maintenant. – parishodak

0

Je ne peux pas effectuer d'actions sur l'étiquette d'étendue. Il est donc préférable d'obtenir une balise div/link afin de pouvoir effectuer des actions dessus.

//span[.='News']/ancestor::a 
//span[contains(.,'s')]/ancestor::a 

<!-- Any of its innerHTML Text (with out case-sensitive)--> 
//a[contains(.,'YY')] 

<!-- Next followed child nodes. --> 
//a[span[text()='News']] 
//a[span='News' and @style="height: 88px; line-height: 88px;"] 

<!-- Any of its child - child nodes. --> 
//a[.//span[text()='SS']] 


//a[[.='News'] and [.//span[contains(.,'YY')]]] 
//a[span='News' and [.//span[contains(.,'YYY')]] ] 

Test XML:

<a href="________" itemprop="url" style="height: 8px; line-height: 88px;"> 
    <span class="avia-menu-text">News</span> 
    <span class="avia-menu-fx"> 
     <span class="avia-arrow-wrap">SS 
      <span class="avia-arrow">YYY</span> 
     </span> 
    </span> 
</a> 
0

Ecrire XPath que vous décrivez:

dont vous avez besoin:

un lien qui utilise une durée définie en son sein?

Voici donc XPath:

//a[.//span] 

et rendre la durée plus précis:

//a[.//span[text()='News']] 

ou

//a[.//span[contains(@class,'avia-menu-text')][text()='News']] 

Vous pouvez également ajouter quelques spécifications à l'élément a, ou c'est l'élément parent pour être sûr que vous fou nd article correct.