Come forzare Selenium WebDriver a fare clic sull’elemento che non è attualmente visibile?

Sto usando l’API Java Selenium 2 con FirefoxDriver. Quando riempio un modulo, le caselle di controllo vengono aggiunte alla pagina in base agli input dei moduli.

Mi piacerebbe simulare un clic su quelle caselle usando Selenium. L’elemento è visibile e utilizzabile in un normale browser, ma il selenium afferma che gli elementi non sono visibili.

"Element is not currently visible and so may not be interacted with" 

Posso forzare il selenium a ignorare lo stato non visibile degli elementi? Come posso forzare il selenium a interagire con l’elemento non visibile?

Il selenium determina che un elemento è visibile o meno secondo i seguenti criteri (usa un ispettore DOM per determinare quale css si applica al tuo elemento, assicurati di guardare allo stile calcolato):

  • visibilità! = nascosto
  • display! = none (è anche verificato rispetto a ogni elemento genitore)
  • opacity! = 0 (non viene selezionato per fare clic su un elemento)
  • altezza e larghezza sono entrambi> 0
  • per un input, il tipo di attributo! = hidden

Il tuo elemento corrisponde a uno di questi criteri. Se non hai la possibilità di cambiare lo stile dell’elemento, ecco come puoi farlo forzatamente con javascript (assumendo WebDriver da quando hai detto l’API Selenium2):

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

Ma questo non genererà un evento javascript, se dipenderai dall’evento change per quell’input, dovrai farlo anche tu (molti modi per farlo, è più facile usare qualsiasi libreria javascript caricata su quella pagina).

La fonte per il controllo della visibilità –

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

La specifica WebDriver che definisce questo –

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

A volte questo significa che ci sono più elementi su una pagina che hanno la stessa proprietà che stai cercando di cercare e stai “parlando con quello sbagliato”.

Se il tuo elemento non può essere identificato in modo univoco da: id o: name (o: class), potrebbe essere difficile.

A volte la ricerca dell’elemento da parte di: xpath aiuta e in alcuni casi anche ciò non è pratico.

In questi casi, potresti dover ottenere tutti gli elementi che corrispondono ai tuoi criteri e fare riferimento a quello giusto dall’indice. È sporco, ma funziona.

Uso Selenium / Watir dall’app Ruby on Rails, quindi nel mio caso l’esempio sarebbe:

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

Spero che questo ti aiuti.

Ho avuto un problema simile, ma era correlato all’elemento non visibile nella finestra. Ho preso uno screenshot e ho realizzato che la finestra del browser era troppo stretta e l’elemento non poteva essere visto. Ho fatto uno di questi e ha funzionato:

 driver.maximize_window() 

Vedi: WebDriver.maximize_window ()

Oppure puoi usare la Selenium Action Class per simulare l’interazione dell’utente – Ad esempio

  WebDriver = new FirefoxDriver(); WebElement menu = driver.findElement(By.xpath("")); // the triger event element Actions build = new Actions(driver); // heare you state ActionBuider build.moveToElement(menu).build().perform(); // Here you perform hover mouse over the needed elemnt to triger the visibility of the hidden WebElement m2m= driver.findElement(By.xpath(""));//the previous non visible element m2m.click(); 

C’è anche un altro caso in cui l’elemento visibile verrà riconosciuto come non visibile:

  • Quando l’elemento è trasformato da CSS
  • Quando l’elemento genitore dell’elemento è trasformato da CSS

Per verificare se l’elemento con cui non vuoi interagire è CSS trasformato, su CHROME fai questo:

  1. ispettore aperto
  2. Trova un elemento interessante (o più probabilmente il suo elemento genitore, presumibilmente elemento div)
  3. Seleziona la scheda “Calcasting”
  4. se c’è un parametro: webkit-transform: matrix (…) significa che l’elemento è CSS trasformato, e potrebbe non essere riconosciuto dal selenium 2 come elemento visibile

L’invisibilità può anche essere dovuta al tempo in cui l’elemento dovrebbe apparire lentamente. Costringere il browser ad aspettare un po ‘potrebbe aiutare in questo caso.

Vedi, ad esempio, la domanda su come lasciare che WebDriver aspetti fino a quando un elemento è presente .

Ho avuto lo stesso problema con il selenium 2 in Internet Explorer 9, ma la mia soluzione è davvero strana. Non ero in grado di fare clic sugli input all’interno del mio modulo -> ripetizioni di selenium, non sono visibili.

Si è verificato quando la mia forma aveva ombre curve -> http://www.paulund.co.uk/creating-different-css3-box-shadows-effects : nel concreto “Effect n ° 2”

Non ho idea, perché e in che modo questa soluzione pseudo-elemento ha fermato i test sul selenium, ma funziona per me.

Non è ansible forzare l’accesso / modifica di elementi a cui l’utente normalmente non ha accesso, poiché Selenium è progettato per imitare l’interazione dell’utente.

Se si verifica questo errore, controlla se:

  • l’elemento è visibile nel tuo viewport, prova a massimizzare la finestra corrente che sta usando il webdriver (es. maxim maximize() in node.js , maxim_window maximize_window() in Python),
  • il tuo elemento non appare due volte (sotto lo stesso selettore), e stai selezionando quello sbagliato,
  • se il tuo elemento è nascosto, allora considera di renderlo visibile,
  • se si desidera accedere / modificare il valore dell’elemento nascosto nonostante la limitazione, quindi utilizzare Javascript per questo (ad esempio executeScript() in node.js , execute_script() in Python).

Ho appena risolto questo errore durante l’utilizzo di capybara nel progetto ror aggiungendo:

 Capybara.ignore_elements = true 

to features/support/env.rb

Ho appena risolto questo errore aspettando la proprietà di visualizzazione degli elementi

 waitFor() { element.displayed } 

Approfitto dell’eccezione ElementNotVisibleException che utilizza il selenium per test funzionali su un sito django con glyphicon di bootstrap come collegamenti in modelli come:

  

Durante i miei test funzionali, lo stile bootstrap non è caricato, quindi provare a fare clic su tali collegamenti aumenterà ElementNotVisibleException. Riesco a renderli selezionabili aggiungendo semplicemente uno spazio nel tag, in questo modo:

   

La risposta accettata ha funzionato per me. Di seguito è riportato un codice per trovare l’elemento genitore che sta facendo in modo che Selenium non sia visibile.

 function getStyles(element){ computedStyle = window.getComputedStyle(element); if(computedStyle.opacity === 0 || computedStyle.display === "none" || computedStyle.visibility === "hidden" || (computedStyle.height < 0 && computedStyle.height < 0) || element.type === "hidden") { console.log("Found an element that Selenium will consider to not be visible") console.log(element); console.log("opacity: " + computedStyle.opacity); console.log("display: " + computedStyle.display); console.log("visibility: " + computedStyle.visibility); console.log("height: " + computedStyle.height); console.log("width: " + computedStyle.width); } if(element.parentElement){ getStyles(element.parentElement); } } getStyles(document.getElementById('REPLACE WITH THE ID OF THE ELEMENT YOU THINK IS VISIBLE BUT SELENIUM CAN NOT FIND'));