Il webdriver Selenium non può fare clic su un collegamento esterno alla pagina

Sto riscontrando un problema con Selenium WebDriver. Provo a fare clic su un link che si trova all’esterno della pagina della finestra (è necessario scorrere verso l’alto per vederlo). Il mio codice attuale è abbastanza standard:

menuItem = driver.findElement(By.id("MTP")); menuItem.click(); // I also tried menuItem.sendKeys(Keys.RETURN); 

So che potrei scorrere, e funzionerebbe in questo caso. Ma in un caso in cui hai una lunga lista di elementi, non devi necessariamente sapere quanto lontano devi scorrere verso il basso.

C’è un modo per fare clic su un collegamento che non si trova sulla parte visibile della pagina (ma che sarebbe visibile se si scorre)?

Come nota a margine, sto usando Firefox, ma sto pensando di utilizzare anche IE7 / 8/9 e Chrome.

Qualsiasi aiuto sarebbe molto apprezzato.

Modifica: temo di non poter fornire il codice sorgente, in quanto la società per cui lavoro non lo consente, ma posso fornire il codice del collegamento su cui voglio fare clic:

  

Lo stesso identico codice funziona quando il link è visibile, solo quando non lo è non funziona.

Edit2: In realtà, abbastanza stranamente, non solleva alcuna eccezione e va semplicemente alla prossima istruzione. Quindi, in pratica, ciò che accade è:

 menuItem = driver.findElement(By.id("MTP")); // no exception menuItem.click(); // no exception //... some code ensuring we got to the next page: timeout reached driver.findElement(By.id("smLH")).click(); // NoSuchElementException, as we're on the wrong page. 

In realtà è ansible scorrere automaticamente sull’elemento. Anche se in questo caso non è una buona soluzione (ci deve essere un modo per farlo funzionare senza scorrere) lo posterò come soluzione alternativa. Spero che qualcuno possa venire con un’idea migliore …

 public void scrollAndClick(By by) { WebElement element = driver.findElement(by); int elementPosition = element.getLocation().getY(); String js = String.format("window.scroll(0, %s)", elementPosition); ((JavascriptExecutor)driver).executeScript(js); element.click(); } 

Mi sono imbattuto in un problema simile di recente quando c’era una lista di oggetti selezionabili in una finestra di dialogo JS. A volte il selenium non seleziona l’object corretto nell’elenco. Quindi ho trovato questo suggerimento javascript:

 WebElement target = driver.findElement(By.id("myId")); ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", target); Thread.sleep(500); //not sure why the sleep was needed, but it was needed or it wouldnt work :( target.click(); 

Questo ha risolto il mio problema

Ho postato la stessa risposta in un’altra domanda quindi questa è solo una copia e incolla.

Una volta avevo una casella combinata che non era in vista e che avevo bisogno di espandere. Quello che ho fatto è stato utilizzare il builder Azioni perché la funzione moveToElement () scorrerà automaticamente l’object in vista. Quindi può essere cliccato.

 WebElement element = panel.findElement(By.className("tabComboBoxButton")); Actions builder = new Actions(this.driver); builder.moveToElement(element); builder.click(); builder.build().perform(); 

(il pannello è semplicemente un elemento avvolto nel mio POM)

Invece di spostare la barra di scorrimento sulla posizione del pulsante, che a volte non ha funzionato per me, invio il tasto Invio al pulsante

 var element = driver.FindElement(By.Id("button")); element.SendKeys(Keys.Enter); 

Ehi, puoi usare questo per ruby

 variable.element.location_once_scrolled_into_view 

Memorizza l’elemento da trovare nella variabile

Questa soluzione ha funzionato come un fascino per me:

 public void click(By by) throws Exception{ WebElement element = driver.findElement(by); ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element); Thread.sleep(500); element.click(); } 

Potrebbe verificarsi perché l’elemento dell’intestazione o l’elemento del piè di pagina potrebbero bloccare la vista dell’elemento su cui si desidera eseguire un’azione. Il selenium cerca di scorrere fino alla posizione dell’elemento quando deve eseguire un’azione sull’elemento (sto usando Selenium WebDriver v3.4.0).

Ecco una soluzione –

 private WebElement scrollToElementByOffset(WebElement element, int offset) { JavascriptExecutor jse = (JavascriptExecutor) driver; jse.executeScript("window.scrollTo(" + element.getLocation().getX() + "," + (element.getLocation().getY() + offset) + ");"); return element; } 

La funzione sopra riportata fa scorrere la vista sull’elemento e quindi scorre ulteriormente in base all’offset fornito. E puoi chiamare questo metodo facendo qualcosa come –

 WebElement webElement = driver.findElement(By.id("element1")); scrollToElementByOffset(webElement, -200).click(); 

Ora, questa è solo una soluzione. Sono lieto di ricevere migliori soluzioni a questo problema.

Questo funziona per me (in c #) –

 item = driver.findelement(by.....); item.SendKeys(Keys.LeftControl); item.Click(); 

Solo un’aggiunta: nel mio caso il pulsante è stato sovrapposto da un altro pulsante mobile.

Il semplice ridimensionamento della finestra del browser ha risolto il problema!

Ho usato il metodo qui sotto per risolvere un problema simile per Selenium Java:

 public static void scrollToElementByElement(WebElement element) { Coordinates coordinates = ((Locatable)element).getCoordinates(); coordinates.inViewPort(); coordinates.click(); //if needed } 

Quindi ho chiamato il metodo sulla mia class di test principale