web-dev-qa-db-fra.com

Comment faire défiler l'élément avec Selenium WebDriver en utilisant C #

Comment faire en sorte que Selenium WebDriver fasse défiler jusqu'à un élément particulier pour le faire apparaître à l'écran. J'ai essayé beaucoup d'options différentes mais je n'ai pas eu de chance. Cela ne fonctionne-t-il pas dans les liaisons C #?

Je peux le faire sauter à un emplacement particulier ex ((IJavaScriptExecutor)Driver).ExecuteScript("window.scrollTo(0, document.body.scrollHeight - 150)"); Mais je veux pouvoir l'envoyer à différents éléments sans donner l'emplacement exact à chaque fois.

public IWebElement Example { get { return Driver.FindElement(By.Id("123456")); } }

Ex 1) ((IJavaScriptExecutor)Driver).ExecuteScript("arguments[0].scrollIntoView(true);", Example);

Ex 2) ((IJavaScriptExecutor)Driver).ExecuteScript("window.scrollBy(Example.Location.X", "Example.Location.Y - 100)");

Lorsque je le regarde, la page ne passe pas à l'élément et l'exception correspond à l'élément hors écran.

Mise à jour: j'ai ajouté un bool ex = Example.Exists (); après et vérifié les résultats. Il existe (c'est vrai). Ce n'est pas affiché (car il est toujours hors écran car il n'a pas été déplacé vers l'élément) Ce n'est pas sélectionné ??????

Quelqu'un voit le succès By.ClassName. Est-ce que quelqu'un sait s'il y a un problème à faire cela By.Id dans les liaisons c #?

14
merrua

Sa question un peu plus ancienne, mais je crois qu’il existe une meilleure solution que celle suggérée ci-dessus.

Voici la réponse originale: https://stackoverflow.com/a/26461431/1221512

Vous devez utiliser la classe Actions pour faire défiler l'élément.

var element = driver.FindElement(By.id("element-id"));
Actions actions = new Actions(driver);
actions.MoveToElement(element);
actions.Perform();
29
DRAX

Cela fonctionne pour moi dans Chrome, IE8 et IE11:

public void ScrollTo(int xPosition = 0, int yPosition = 0)
{
    var js = String.Format("window.scrollTo({0}, {1})", xPosition, yPosition);
    JavaScriptExecutor.ExecuteScript(js);
}

public IWebElement ScrollToView(By selector)
{
    var element = WebDriver.FindElement(selector);
    ScrollToView(element);
    return element;
}

public void ScrollToView(IWebElement element)
{
    if (element.Location.Y > 200)
    {
        ScrollTo(0, element.Location.Y - 100); // Make sure element is in the view but below the top navigation pane
    }

}
13
milanio

Cela fonctionne pour moi:

var elem = driver.FindElement(By.ClassName("something"));
driver.ExecuteScript("arguments[0].scrollIntoView(true);", elem);
9
user3734429

Pour faire défiler à l'intérieur de la page ici j'ai un petit code et une solution

Mon scénario était jusqu'à ce que je fasse défiler la page. Le bouton Accepter et ne pas accepter n'était pas activé. J'avais 15 termes et conditions à partir desquels j'avais besoin de sélectionner le 15ème terme en inspectant la page Web et en prenant l'identifiant du dernier paragraphe des conditions.

driver.FindElement(By.Id("para15")).Click();

<div id="para15">One way Non-Disclosure Agreement</div>
0
query s