102 votes

Comment forcer Selenium WebDriver à cliquer sur un élément qui n'est pas actuellement visible?

Je utilise l'API Selenium 2 Java avec FirefoxDriver. Quand je remplis un formulaire, des cases à cocher sont ajoutées à la page en fonction des entrées du formulaire.

Je voudrais simuler un clic sur ces cases à cocher en utilisant Selenium. Les éléments sont visibles et utilisables dans un navigateur régulier, mais Selenium affirme que les éléments ne sont pas visibles.

"L'élément n'est pas actuellement visible et ne peut donc pas interagir avec"

Puis-je forcer Selenium à ignorer l'état non visible des éléments? Comment puis-je forcer Selenium à interagir avec l'élément non visible?

0 votes

Quel navigateur utilisez-vous? Vous ne pouvez pas interagir avec des éléments qui sont désactivés ou invisibles car un utilisateur final ne pourrait pas interagir avec eux. Vous devrez fournir votre code de test et la source de la page si vous voulez que je tente de diagnostiquer le problème.

105voto

lukeis Points 798

Selenium détermine si un élément est visible ou non selon les critères suivants (utilisez un inspecteur DOM pour déterminer quel CSS s'applique à votre élément, assurez-vous de regarder le style calculé) :

  • visibilité != caché
  • affichage != aucun (est également vérifié pour chaque élément parent)
  • opacité != 0 (ceci n'est pas vérifié pour cliquer sur un élément)
  • la hauteur et la largeur sont toutes deux > 0
  • pour un input, l'attribut type != caché

Votre élément correspond à l'un de ces critères. Si vous n'avez pas la possibilité de modifier le style de l'élément, voici comment vous pouvez le faire de force avec du javascript (je vais supposer WebDriver puisque vous avez mentionné l'API Selenium 2) :

((JavascriptExecutor)driver).executeScript("arguments[0].checked = true;", inputElement);

Mais cela ne déclenchera pas un événement javascript, si vous dépendez de l'événement de changement pour cet input, vous devrez également le déclencher (il existe de nombreuses façons de le faire, le plus simple est d'utiliser la bibliothèque javascript chargée sur cette page).

La source pour la vérification de la visibilité -

https://github.com/SeleniumHQ/selenium/blob/master/javascript/atoms/dom.js#L577

La spécification WebDriver qui définit cela -

https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html#widl-WebElement-isDisplayed-boolean

1 votes

Avez-vous une source (ou un lien canonique) pour la liste des conditions?

2 votes

Tant que vous pouvez lire Javascript, la méthode bot.dom.isShown est ce qui détermine la visibilité : code.google.com/p/selenium/source/browse/trunk/javascript/at‌​oms/…

0 votes

Qu'est-ce que inputElement ici. Je lance le code ci-dessous WebElement inputElement = driver.findElement(By.xpath(PASSWORD_PATH)); ((JavascriptExecutor)driver).executeScript("arguments[0].‌ checked = true;", inputElement); Mais pas d'aide inputElement.sendKeys(mot de passe);

27voto

ranktrackerpro Points 241

Parfois cela signifie qu'il y a plusieurs éléments sur une page qui ont la même propriété que vous essayez de rechercher et vous "parlez au mauvais".

Si votre élément ne peut pas être identifié de manière unique par :id ou :name (ou :class), cela pourrait être délicat.

Parfois, la recherche de l'élément par le :xpath aidera et dans certains cas même cela n'est pas pratique.

Dans ces cas, vous devrez peut-être obtenir tous les éléments qui correspondent à vos critères et faire référence au bon élément par l'index. C'est sale, mais ça fonctionne.

Je vais utiliser Selenium / Watir avec une application Ruby on Rails, donc dans mon cas l'exemple serait le suivant :

browser = Watir::Browser.new(:firefox, :profile => "default")       
browser.goto("http://www.google.com/analytics")
# login
browser.divs(:text, "+ Nouvelle propriété").last.click

J'espère que cela aide.

0 votes

Ajouter un id à l'élément du DOM a résolu le problème pour moi

0 votes

J'ai eu le même problème et ajuster le XPath pour qu'il puisse distinguer un élément unique a fait l'affaire.

0 votes

J'ai eu le même problème. J'ai changé l'appel à findElements() pour compter les correspondances et il y avait un élément supplémentaire qui correspondait. Merci!

7voto

user1704828 Points 11

Il y a aussi un autre cas où un élément visible sera reconnu comme non visible :

  • Quand l'élément est transformé en CSS
  • Quand l'élément parent de l'élément est transformé en CSS

Pour vérifier si l'élément avec lequel vous voulez interagir est transformé en CSS, sur CHROME, faites ceci :

  1. Ouvrez l'inspecteur
  2. Recherchez l'élément intéressant (ou plus probablement son élément parent, supposément l'élément div)
  3. Sélectionnez l'onglet 'Calculé'
  4. Si un paramètre apparaît : webkit-transform: matrix( ... ), cela signifie que l'élément est transformé en CSS et peut ne pas être reconnu par Selenium 2 comme un élément visible

0 votes

Alors comment surmonter ce problème?

5voto

avandeursen Points 1597

L'invisibilité peut également être due au timing lorsque l'élément est censé apparaître lentement. Forcer le navigateur à attendre un peu pourrait aider dans ce cas.

Par exemple, voir la question sur laisser WebDriver attendre jusqu'à ce qu'un élément soit présent.

2voto

Agoreddah Points 21

J'avais le même problème avec selenium 2 dans Internet Explorer 9, mais ma solution est vraiment étrange. Je n'étais pas en mesure de cliquer sur les entrées à l'intérieur de mon formulaire -> selenium les répète, ils ne sont pas visibles.

Cela s'est produit lorsque mon formulaire avait des ombres courbées -> http://www.paulund.co.uk/creating-different-css3-box-shadows-effects : dans "Effet n°2" en particulier.

Je ne sais pas pourquoi et comment cette solution avec les pseudo-éléments a arrêté les tests selenium, mais cela fonctionne pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X