Défilement de l'Élément dans la Vue avec le Sélénium
Est-il de toute façon dans les deux Sélénium 1.x ou 2.x pour faire défiler la fenêtre du navigateur de sorte qu'un élément est identifié par un XPath est en vue du navigateur? Il y a une méthode focus en Sélénium, mais il ne semble pas physiquement faites défiler l'affichage dans FireFox. Quelqu'un aurait-il des suggestions sur la façon de faire cela?
La raison que j'ai besoin c'est que je suis en essais clic sur un élément de la page. Malheureusement, l'événement n'a pas l'air de fonctionner, sauf si l'élément est visible. Je n'ai pas de contrôle du code qui se déclenche lorsque l'élément est cliqué, donc je ne peux pas corriger ou apporter des modifications à elle, de sorte que, solution la plus facile, faites défiler jusqu'à l'élément dans la vue.
- Vous pouvez essayer cette hacky une si rien d'autre ne fonctionne pour vous: stackoverflow.com/a/53771434/7093031
Vous devez vous connecter pour publier un commentaire.
Ont essayé beaucoup de choses à l'égard de défilement, mais le code ci-dessous a fourni de meilleurs résultats.
Cette défiler jusqu'à ce que l'élément est en vue :
position: fixed
sur votre page et c'est occulter l'élément Sélénium veut cliquez sur. Assez souvent, ces éléments fixes, aller au fond, le choix descrollIntoView(true)
se déplace bien au-dessus de la fenêtre d'affichage.true
àscrollIntoView
si l'objet que le défilement est en dessous de là où vous êtes actuellement,false
si l'objet que le défilement est au-dessus de là où vous êtes actuellement. J'ai eu du mal à le comprendre.((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true); window.scrollBy(0,-100);", element); element.click()`;
true
aligne l'élément vers le haut de l'écran, tandis quefalse
aligne l'élément vers le bas de l'écran.Vous pouvez utiliser le
org.openqa.selenium.interactions.Actions
classe pour passer à un élément.Java:
Python:
from selenium.webdriver.common.action_chains import ActionChains #... ActionChains(driver).move_to_element(element).perform()
driver.switch_to.frame()
.Vous pouvez essayer cette.
js.ExecuteScript("arguments[0].scrollIntoView(true);" + "window.scrollBy(0,-100);", e);
pour IE et Firefox, etjs.ExecuteScript("arguments[0].scrollIntoViewIfNeeded(true);", e);
pour Chrome. Simple.Si vous voulez faire défiler sur la fenêtre de Firefox, en utilisant Selenium webdriver, l'un des moyens est l'utilisation de JavaScript dans le code Java. Le code JavaScript pour faire défiler vers le bas (vers le bas de la page web) est comme suit:
Pour plus d'exemples, rendez-vous ici. Tous en russe, mais le code Java est multi-culturelle 🙂
Cibler n'importe quel élément et l'envoi vers le bas les touches (ou haut/gauche/droite) semble fonctionner aussi. Je sais que c'est un peu un hack, mais je ne suis pas vraiment dans l'idée de l'utilisation de JavaScript pour résoudre le problème de défilement soit.
Sélénium 2 essaie de faire défiler jusqu'à l'élément et cliquez sur elle. C'est parce que le Sélénium 2 ne sera pas interagir avec un élément, sauf si elle pense qu'elle est visible.
De défilement de l'élément qui se passe implicitement donc, vous avez juste besoin de trouver l'élément, puis de travailler avec elle.
WebElement.click()
exige l'élément à être visibles afin de cliquer sur elle. Il ne sera pas défiler sur votre compte.Vous pouvez utiliser ce bout de code pour faire défiler:
C#
Là vous l'avez
Utiliser le pilote d'envoyer des touches de l' page suivante ou downarrow pour afficher l'élément dans la vue. Je sais que c'est trop simple d'une solution et peuvent ne pas être applicables dans tous les cas.
element
dans la partie visible de la page et l'envoi de PageDownelement.SendKeys(Keys.PageDown);
a fonctionné pour moi.En Sélénium nous avons besoin de prendre l'aide d'un JavaScript exécuteur testamentaire pour faire défiler jusqu'à un élément ou faire défiler la page:
Dans la déclaration ci-dessus
element
est l'exact où nous avons besoin de les faire défiler.J'ai essayé le code ci-dessus, et il a travaillé pour moi.
J'ai un poste complet et vidéo sur ce:
http://learn-automation.com/how-to-scroll-into-view-in-selenium-webdriver/
Cela a fonctionné pour moi:
De mon expérience, Selenium Webdriver n'a pas de défilement automatique sur un élément cliquez sur quand il y a plus d'un défilement de l'article sur la page (ce qui est assez fréquent).
Je suis à l'aide de Ruby, et pour ma AUT, j'ai eu à monkey patch la méthode de clic comme suit;
Le " location_once_scrolled_into_view méthode est une méthode existante sur WebElement classe.
J'ai aprécier vous ne pouvez pas être à l'aide de Ruby, mais il devrait vous donner quelques idées.
module Capybara :: module Node
, et j'ai besoin d'appelernative.location_once_scrolled_into_view
au lieu de simplementlocation_once_scrolled_into_view
. J'ai aussi sauvé::Selenium::WebDriver::Error::UnknownError
, qui est ce que je suis souvent dans Firefox 44.0.2. Mais je trouve cette solution de ne pas être assez souple et, finalement, mettre le<Element>.native.location_once_scrolled_into_view
appels dans l'acceptation du test lui-même, immédiatement suivie parpage.execute_script('window.scrollByPages(-1)')
en cas de besoin.Le script Ruby pour le défilement d'un élément dans la vue ci-dessous.
Parfois, j'ai aussi été confronté au problème de défilement avec le Sélénium. J'ai donc utilisé javaScriptExecuter pour atteindre cet objectif.
Pour faire défiler vers le bas:
Ou, aussi
Pour faire défiler vers le haut:
Ou,
Si vous pensez que d'autres réponses étaient trop hacky, celui-ci est de trop, mais il n'y a pas de JavaScript injection impliqués.
Lorsque le bouton est hors de l'écran, il se casse et parchemins, donc essayez de nouveau... \_(ツ)_/
C'est une répétition de la solution avec le JavaScript, mais avec un ajout d'attente pour l'élément.
Sinon
ElementNotVisibleException
peut apparaître si certains d'action sur l'élément qui est fait.J'ai utilisé de cette façon pour le défilement de l'élément et cliquez sur:
scrollIntoView(false)
travaillé, maisscrollIntoView(true)
n'a pas. peut travailler, cela dépend de votre scénario.Vous pouvez visiter la page Faites défiler éléments Web et la page Web - Selenium WebDriver à l'aide de Javascript:
En plus de la situation pour faire défiler ce code fonctionne.
JAVA
Essayer faites défiler jusqu'à l'élément d'utiliser
x y
position, et l'utilisationJavascriptExecutor
avec c'est l'argument:"window.scrollBy(x, y)"
.D'importation suivantes:
Abord, vous devez obtenir
x y
emplacement de l'élément.Le sélénium peut faire défiler jusqu'à un élément dans la barre de défilement automatiquement pour une simple INTERFACE utilisateur, mais pour le lazy-load UI, scrollToElement est toujours nécessaire.
C'est mon implémentation en Java avec JavascriptExecutor.
Vous pouvez trouver plus de détails en Satix code source:
http://www.binpress.com/app/satix-seleniumbased-automation-testing-in-xml/1958
Le comportement par défaut de Sélénium nous pour faire défiler si l'élément est à peine en vue du sommet de la fenêtre d'affichage. Aussi, tous les navigateurs ont exactement le même comportement. C'est très dis-satisfaisant. Si vous enregistrez des vidéos de votre navigateur tests, comme je fais, de ce que vous voulez est pour l'élément pour faire défiler l'affichage et être centrée verticalement.
Voici ma solution pour Java:
Et puis, pour faire défiler, vous l'appelez comme ceci:
Voici comment je le fais avec PHP webDriver pour le Sélénium. Il Travaille pour le Sélénium serveur autonome 2.39.0 + https://github.com/Element-34/php-webdriver + Firefox 25.0
Remarque: j'utilise une version personnalisée de la Element34 PHP-webdriver. Mais il n'y a aucun changement dans le noyau. Je viens d'utiliser mon "welement" au lieu de "élément". Mais il ne fait aucune influence sur le cas en question. Le conducteur auteur dit "pour permettre à presque tous les appels d'API à une transformation directe de ce qui est défini dans le WebDriver protocole lui-même." Donc, vous ne devriez avoir aucun problème avec d'autres langages de programmation.
Cliquant juste ne fonctionnera pas dans ma configuration. Il va faire un défilement au lieu de cliquer, j'ai donc eu à cliquer deux fois sans appel "location_in_view()".
Remarque: Cette méthode fonctionne pour les éléments qui peuvent être considérés, comme un input de type button.
Prendre un coup d'oeil à:
http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/location
La description pour JsonWireProtocol# suggèrent l'utilisation de l'emplacement + moveto, parce que l'endroit _in_view est une méthode interne.
Quelque chose qui a fonctionné pour moi a été d'utiliser le Navigateur.MoveMouseToElement méthode sur un élément en bas de la fenêtre du navigateur. Miraculeusement, il a travaillé dans Internet Explorer, Firefox et Chrome.
J'ai choisi ce sur le JavaScript de la technique d'injection, juste parce qu'il se sentait moins hacky.
J'ai fait des tests avec la composante FAD et vous devez avoir une commande séparée pour le défilement si le chargement paresseux est utilisé. Si l'objet n'est pas chargé et que vous essayez de le trouver à l'aide de Sélénium le Sélénium permettra de jeter un élément n'est pas trouvé exception.
Si rien ne fonctionne, essayez le avant de cliquer:
En Java, on peut faire défiler à l'aide de JavaScript, comme dans le code suivant:
Vous pouvez affecter une valeur désirée pour le "elm.scrollTop" à la variable.
Une solution est:
Ce code fonctionne pour moi:
Je suis d'accord avec tout le monde ici, qui disent "le Sélénium a un implicite de l'option de défilement". Aussi, si vous avez été en Sélénium 1 et maintenant, vous avez mis à jour vous-même le Sélénium 2 et recherchez la version précédente commandes, vous pouvez utiliser la commande connu sous le nom:
Vous pouvez faire usage de ces et utiliser les commandes de ces deux versions.
Faire un random cliquez sur en bas de la page:
Puis faire ce que vous voulez faire.