2015-02-12 14 views
9

Come faccio a scaricare Selenium WebDriver per scorrere su un particolare elemento per farlo apparire sullo schermo. Ho provato molte opzioni diverse ma non ho avuto fortuna. Non funziona nelle associazioni C#?Come scorrere fino a elemento con Selenium WebDriver usando C#

Posso farlo saltare in una posizione particolare ex ((IJavaScriptExecutor)Driver).ExecuteScript("window.scrollTo(0, document.body.scrollHeight - 150)"); Ma voglio essere in grado di inviarlo a elementi diversi senza dare la posizione esatta ogni volta.

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)");

Quando lo guardo, ma non salta in basso nella pagina all'elemento, e l'eccezione corrisponde elemento essendo fuori dallo schermo .

Aggiornamento: Ho aggiunto un bool ex = Example.Exists(); dopo di esso e controllato i risultati. Esiste (è vero). Non visualizzato (poiché è ancora fuori dallo schermo in quanto non è stato spostato sull'elemento) Non selezionato ??????

Qualcuno sta vedendo successo By.ClassName. Qualcuno sa se c'è un problema nel fare questo By.Id nelle associazioni C#?

+0

Forse si può provare a simulare la pressione dei tasti "Freccia in basso", fino a quando l'Eccezione non scompare. So che sta correndo contro il muro fino a quando il muro non si rompe, ma se vuoi che funzioni in qualche modo potrebbe essere una soluzione ?! – krizz

+0

Puoi provare con una cosa, usare il metodo ExpectedConditions.visibilityOfElement e metterlo come una condizione del ciclo while e in loop far scorrere la vista da alcuni dicono 100, 100 coordinate. –

+0

Prima che il javascript venga chiamato, sei sicuro che WebDriver abbia trovato il tuo elemento? – Jordan

risposta

21

La sua piccola domanda più vecchio, ma credo che ci sia una soluzione migliore di quanto suggerito sopra.

Ecco risposta originale: https://stackoverflow.com/a/26461431/1221512

Si dovrebbe usare classe azioni per eseguire lo scorrimento di elemento.

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

Questo ha funzionato alla grande per me, grazie. Non ho mai prestato attenzione a Actions, ma sono venuti fuori un paio di volte di recente. Dovrei davvero saperne di più su di loro. – Joel

6

questo funziona per me:

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

By.ClassName non sarebbe abbastanza unico per quello che sto cercando. Ho provato quanto sopra e non funzionerà By.Id per me. Stai suggerendo che il problema è By.Id? Vedi questo scorrimento fuori schermo per By.ClassName ma non By.ID? – merrua

+0

By.ClassName è solo un esempio di ricerca di un elemento.Puoi usare qualsiasi cosa tu voglia/bisogno per trovare l'elemento. La vera magia qui è di scorrere fino all'elemento che avviene nel metodo scrollIntoView() di JavaScript. Se hai difficoltà a trovare un elemento prova a postare qui l'HTML. – user3734429

+1

Ho appena testato la soluzione suggerita e sta funzionando. Come ha detto l'utente3734429, non sei obbligato a filtrare per nome della classe, tutto ciò di cui hai bisogno è WebElement (dipende da te come lo otterrai, selezionando per classe è solo un modo). – DRAX

9

Questo funziona per me in Chrome, IE8 & 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 
    } 

} 
+1

Amico, sei il migliore! –

+0

100+ per questa risposta! Grazie uomo – Umar

Problemi correlati