Debug dell’errore “Elemento non cliccabile al punto”

Lo vedo solo in Chrome.

Il messaggio di errore completo riporta:

“org.openqa.selenium.WebDriverException: l’elemento non è selezionabile al punto (411, 675). L’altro elemento riceverà il clic: …”

L’elemento che “riceverebbe il clic” si trova sul lato dell’elemento in questione, non su di esso e non si sovrappone, non si muove attorno alla pagina.

Ho provato ad aggiungere un offset, ma anche questo non funziona. L’articolo si trova sulla finestra visualizzata senza necessità di scorrimento.

Questo è causato dai seguenti 3 tipi:

1. L’elemento non è visibile per fare clic.

Utilizzare Azioni o JavascriptExecutor per far sì che faccia clic.

Per azioni:

WebElement element = driver.findElement(By("element_path")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform(); 

Di JavascriptExecutor:

 JavascriptExecutor jse = (JavascriptExecutor)driver; jse.executeScript("scroll(250, 0)"); // if the element is on top. jse.executeScript("scroll(0, 250)"); // if the element is on bottom. 

o

 JavascriptExecutor jse = (JavascriptExecutor)driver; jse.executeScript("arguments[0].scrollIntoView()", Webelement); 

Quindi fare clic sull’elemento.

2. La pagina viene aggiornata prima di fare clic sull’elemento.

Per fare ciò, fai in modo che la pagina attenda per pochi secondi.

3. L’elemento è cliccabile ma su di esso c’è uno spinner / overlay

Il codice seguente attenderà fino a quando la sovrapposizione non verrà interrotta

 By loadingImage = By.id("loading image ID"); WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds); wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage)); 

Quindi fare clic sull’elemento.

È inoltre ansible utilizzare il clic di JavaScript e lo scorrimento non sarebbe necessario allora.

 IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver; ex.ExecuteScript("arguments[0].click();", elementToClick); 

Sembra che ci sia un bug in chromedriver per questo (il problema è che è contrassegnato come non verrà risolto) -> http://code.google.com/p/selenium/issues/detail?id=2766

( metti forse una taglia su FreedomSponsors ?)

C’è una soluzione suggerita al commento # 27. Forse funzionerà per te.

Ho avuto lo stesso problema, ho provato tutte le soluzioni offerte ma non hanno funzionato per me. alla fine ho usato questo:

 JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript("var evt = document.createEvent('MouseEvents');" + "evt.initMouseEvent('click',true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0,null);" + "arguments[0].dispatchEvent(evt);", findElement(element)); 

Spero che questo ti aiuti

Ho visto questo nella situazione in cui la finestra Chrome guidata da selenium è stata aperta troppo piccola. L’elemento su cui fare clic era fuori dalla finestra e quindi non funzionava.

Sembra logico … l’utente reale dovrebbe ridimensionare la finestra o scorrere in modo che sia ansible vedere l’elemento e in effetti fare clic su di esso.

Dopo aver istruito il driver del selenium per impostare le dimensioni della finestra in modo appropriato, questo problema è andato via per me. L’API del webdriver è qui descritta.

Wow, molte risposte qui e molte buone.

Spero di aggiungere qualcosa alla mia esperienza.

Bene ragazzi, nel mio caso c’era una sovrapposizione di cookie che nascondeva l’elemento ogni tanto. Lo scorrimento sull’elemento funziona anche; ma a mio modesto parere (per il mio caso, non una panacea per tutti) la soluzione più semplice è quella di andare a schermo intero (stavo eseguendo i miei script su un 3/4 della finestra dello schermo)! Quindi eccoci qui:

 driver.manage().window().maximize(); 

Spero possa aiutare!

Stava ricevendo questo errore durante l’esecuzione di test headless con xvfb-run. Stavano lavorando perfettamente a livello locale. Usando chrome, versioni di webdriver / chromedriver / chrome / java ecc. Tutte identiche.

Il bug “non risolverà” in chromedriver – http://code.google.com/p/selenium/issues/detail?id=2766 sottolineato da Tony Lâmpada ha suggerito che questo potrebbe essere correlato a ciò che è / non è visibile sullo schermo.

Il messaggio di aiuto per xvfb-run mostra quanto segue:

 -s ARGS --server-args=ARGS arguments (other than server number and "-nolisten tcp") to pass to the Xvfb server (default: "-screen 0 640x480x8") 

Cambiare la risoluzione per xvfb ha fatto scomparire l’errore:

 xvfb-run -s "-screen 0 1280x1024x16" ... 

ruby / watir-WebDriver / cromo

Io uso il seguente trucco e sembra che funzioni:

 #scroll to myelement @browser.execute_script "window.scrollTo(#{myelement.element.wd.location[0]},#{myelement.element.wd.location[1]})" # click myelement myelement.when_present.fire_event("click") 

Anch’io ho lottato con questo problema. Il codice funziona bene in FF, fallisce su Chrome. Quello che stavo cercando di fare era cliccare su una casella di spunta – se non fosse in vista, avrei scorrere per visualizzare e quindi fare clic. Anche lo scorrimento nella visualizzazione funziona in Chrome, solo i pochi pixel inferiori della casella di controllo non erano visibili, pertanto il webdriver ha rifiutato di fare clic su di esso.

La mia soluzione è questa:

 WebElement element = _sectorPopup.findElement(...); ((Locatable) element).getCoordinates().inViewPort(); try { element.click(); } catch (Exception e) { new Actions(getWebDriver()).sendKeys(Keys.PAGE_DOWN).perform(); element.click(); } 

Chrome ha anche problemi con sendKeys, l’utilizzo delle azioni a volte è necessario. Ovviamente, è necessario sapere in quale direzione e quanto è necessario andare in modo che il tuo chilometraggio possa variare. Ma preferisco questo per l’hack javascript, quindi lo posterò qui nel caso in cui qualcun altro lo trovasse utile.

Innanzitutto, prova a ottenere il driver Chrome più recente e verifica se risolve il problema.

Nel mio caso, non ha risolto il problema. Ma, la soluzione seguente ha funzionato per me finora. Quello che segue è il codice C # ma puoi seguire la stessa logica nella tua lingua specifica. Quello che facciamo qui è

Passaggio 1: concentrarsi sull’elemento usando l’object Azioni selenium,

Passaggio 2: quindi fare un clic sull’elemento

Passo 3: Se c’è un’eccezione, attiviamo un evento “Click” javascript sull’elemento eseguendo lo script javascript tramite il metodo “ExecuteScript” del driver del browser Selenium.

Puoi anche saltare i passaggi 1 e 2 e provare solo il passaggio 3. Il passaggio 3 funzionava da solo, ma ho notato un comportamento strano in uno scenario in cui il passaggio 3, anche se ha fatto correttamente clic sull’elemento, ha causato un comportamento imprevisto in altre parti del mio codice dopo aver fatto clic sull’elemento.

  try { //Setup the driver and navigate to the web page... var driver = new ChromeDriver("folder path to the Chrome driver"); driver.Navigate().GoToUrl("UrlToThePage"); //Find the element... var element = driver.FindElement(By.Id("elementHtmlId")); //Step 1 new Actions(driver).MoveToElement(element).Perform(); //Step 2 element.Click(); } catch (Exception) { //Step 3 driver.ExecuteScript("document.getElementById('elementHtmlId').click();"); } 

Quando si utilizza il protractor questo mi ha aiutato:

 var elm = element(by.css('.your-css-class')); browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement()); elm.click(); 

Stavo affrontando un problema simile quando devo controllare due caselle di spunta una dopo l’altra. Ma stavo ottenendo lo stesso errore di cui sopra ho aggiunto l’attesa tra i miei passaggi per controllare le caselle di controllo …. funziona bene e bene. ecco i passi: –

  When I visit /administrator/user_profiles And I press xpath link "//*[@id='1']" Then I should see "Please wait for a moment..." When I wait for 5 seconds And I press xpath link "//*[@id='2']" Then I should see "Please wait for a moment..." When I visit /administrator/user_profiles_updates 

Ho fatto questo metodo sulla base di un commento dalla risposta di Tony Lâmpada. Funziona molto bene.

 def scroll_to(element) page.execute_script("window.scrollTo(#{element.native.location.x}, #{element.native.location.y})") end 

Apparentemente questo è il risultato di un bug “Will not Fix” nel binario dei driver di Chrome.

Una soluzione che ha funzionato per me (Our Mileage May Vary) può essere trovata in questa discussione del gruppo Google, commento n. 3:

https://groups.google.com/forum/?fromgroups=#!topic/selenium-developer-activity/DsZ5wFN52tc

La parte pertinente è proprio qui:

Da allora ho lavorato attorno al problema navigando direttamente sull’href dell’ancora madre dello span.

. Driver.Navigate () GoToUrl (driver.FindElement (By.Id (embeddedSpanIdToClick)) FindElement (By.XPath ( “.. “)) GetAttribute (” href”)..);

Nel mio caso, sto usando Python, quindi una volta ottenuto l’elemento desiderato, ho semplicemente usato

 driver.get(ViewElm.get_attribute('href')) 

Mi aspetto che funzioni solo, tuttavia, se l’elemento su cui stai tentando di fare clic è un link …

Stavo affrontando lo stesso problema con clj-webdriver (porta del clojure del selenium). Ho appena tradotto la soluzione precedente in Clojure per comodità. Puoi chiamare questa funzione prima di fare clic o qualsiasi altra cosa per evitare questo problema.

 (defn scrollTo "Scrolls to the position of the given css selector if found" [q] (if (exists? q) (let [ loc (location-once-visible q) jscript (str "window.scrollTo(" (:x loc) "," (:y loc) ")") ] (execute-script jscript)))) 

Questo potrebbe accadere se l’elemento cambia posizione mentre il driver sta tentando di cliccarlo (l’ho visto anche con IE). Il driver mantiene la posizione iniziale ma, nel momento in cui viene effettivamente cliccato, quella posizione non punta più a quell’elemento. Il driver FireFox non ha questo problema BTW, apparentemente “fa clic” su elementi a livello di codice.

Ad ogni modo, questo può accadere quando si usano le animazioni o semplicemente si modifica l’altezza degli elementi dynamicmente (es. $("#foo").height(500) ). Devi assicurarti di fare clic sugli elementi solo dopo che la loro altezza si è “stabilizzata”. Ho finito con un codice simile a questo (collegamenti C #):

 if (!(driver is FirefoxDriver)) { new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until( d => d.FindElement(By.Id(someDynamicDiv)).Size.Height > initialSize); } 

Nel caso di un’animazione o di qualsiasi altro fattore per cui non si possa facilmente eseguire una query, è ansible utilizzare un metodo “generico” che attende la stazionarietà dell’elemento:

 var prevLocation = new Point(Int32.MinValue, Int32.MinValue); int stationaryCount = 0; int desiredStationarySamples = 6; //3 seconds in total since the default interval is 500ms return new WebDriverWait(driver, timeout).Until(d => { var e = driver.FindElement(By.Id(someId)); if (e.Location == prevLocation) { stationaryCount++; return stationaryCount == desiredStationarySamples; } prevLocation = e.Location; stationaryCount = 0; return false; }); 

Ho incontrato questo perché una finestra di dialogo di caricamento copre questo elemento. Lo risolvo semplicemente aggiungendo un’attesa prima di lavorare con questo elemento.

 try { Thread.sleep((int) (3000)); } catch (InterruptedException e) { // e.printStackTrace(); } 

Spero che questo aiuto!

Stavo ricevendo lo stesso problema durante l’esecuzione di script di selenium in Python. Ecco cosa ho usato per fare clic sull’elemento:

 from selenium.webdriver.common.action_chains import ActionChains ActionChains(driver).click(element).perform() 

La risposta di Re Tony Lâmpada, il commento # 27 ha effettivamente risolto il problema per me, tranne che ha fornito il codice Java e avevo bisogno di Python. Ecco una funzione Python che scorre fino alla posizione dell’elemento e quindi fa clic su di esso.

 def scroll_to_and_click(xpath): element = TestUtil.driver.find_element_by_xpath(xpath) TestUtil.driver.execute_script('window.scrollTo(0, ' + str(element.location['y']) + ');') element.click() 

Questo mi ha risolto il problema in Chrome 34.0. Non ha causato danni in Firefox 28.0 e IE 11; quei browser non sono soggetti al problema, ma lo scorrimento fino alla posizione dell’elemento prima di fare clic su di esso non è ancora una cosa negativa.

Forse non è una soluzione veramente pulita ma funziona:

 try: el.click() except WebDriverException as e: if 'Element is not clickable at point' in e.msg: self.browser.execute_script( '$("{sel}").click()'.format(sel=el_selector) ) else: raise 

Stavo ricevendo questo bug perché ho testato un hover e quindi avevo bisogno di cliccare sul link sotto il tooltip. La soluzione consisteva nell’aggiungere page.find('.sp-logo').hover click_link page.find('.sp-logo').hover sopra click_link per rimuovere il tooltip.

Dopo aver testato tutti i suggerimenti citati, niente ha funzionato. Ho fatto questo codice. Funziona, ma non è bello

 public void click(WebElement element) { //https://code.google.com/p/selenium/issues/detail?id=2766 (fix) while(true){ try{ element.click(); break; }catch (Throwable e){ try { Thread.sleep(200); } catch (InterruptedException e1) { e1.printStackTrace(); } } } } public void click(String css) { //https://code.google.com/p/selenium/issues/detail?id=2766 (fix) while(true){ try{ driver.findElement(By.cssSelector(css)).click(); break; }catch (Throwable e){ try { Thread.sleep(200); } catch (InterruptedException e1) { e1.printStackTrace(); } } } } 

Spiegazione del messaggio di errore :

Il messaggio di errore dice semplicemente che l’elemento su cui si desidera fare clic è presente, ma non è visibile. Potrebbe essere coperto da qualcosa o temporaneamente non visibile.

Ci potrebbero essere molte ragioni per cui l’elemento non è visibile nel momento del test. Riscrivi la tua pagina e trova la soluzione adeguata per il tuo caso.

Soluzione per caso particolare :

Nel mio caso, questo errore si verifica, quando un suggerimento dell’elemento sullo schermo che ho appena cliccato, stava saltando sopra l’elemento che volevo fare clic su Avanti. Defocus era una soluzione di cui avevo bisogno.

  • Soluzione rapida per sfocare sarebbe fare clic su un altro elemento in un’altra parte dello schermo che non rispetta “nulla”. non succede nulla dopo un’azione di clic.
  • La soluzione corretta sarebbe chiamare element.blur() sull’elemento che fa il tooltip, il che renderebbe il tooltip scomparire.

Ho avuto lo stesso problema ed è stato causato da un conflitto di id tra il div e il link all’interno del div. Quindi il driver stava facendo clic sul div anziché sul link che volevo. Ho cambiato il div id e ha funzionato correttamente.

Prima:

  

Dopo:

  

Mi sono imbattuto in questo problema e sembra essere causato (nel mio caso) facendo clic su un elemento che fa apparire un div davanti all’elemento cliccato. Ho aggirato il problema avvolgendo il mio clic in un grosso blocco di prova.

In Drupal quando si usa il selenium :

  // Get element. $element = $this->driver->getElement('xpath=//input'); // Get screen location. $location = $element->getLocation(); // To make sure that Chrome correctly handles clicking on the elements // outside of the screen, we must move the cursor to the element's location. $this->driver->moveCursor($location['x'], $location['y']); // Optionally, set some sleep time (0.5 sec in the example below) if your // elements are visible after some animation. time_nanosleep(0, 500000000); // Click on the element. $element->click(); 

Ho avuto lo stesso problema e ho ricevuto l’errore “l’altro elemento avrebbe ricevuto il clic” per un elemento visibile e visibile. Non ho trovato altra soluzione che per triggersre il clic con un javascript.

Ho sostituito:

 WebElement el = webDriver.findElement(By.id("undo-alert")); WebElement closeButton = el.findElement(By.className("close")); // The following throws 'Element is not clickable at point ... Other element // would receive the click' closeButton.click(); 

con:

 ((JavascriptExecutor) webDriver).executeScript( "$('#undo-alert').find('.close').click();" ); 

e tutto ha funzionato bene

Ho avuto lo stesso problema e ho trascorso ore a cercare la soluzione. Ho provato a fare clic su una cella nella parte inferiore di una lunga ngGrid usando il protractor. Ecco un’istantanea del mio html ngGrid:

 ....many rows here..    

la funzione di tutti i clic non ha funzionato. La soluzione consiste nell’utilizzare valutare nello scope corrente dell’elemento:

 element(by.cssContainingText("a", "the test link 100000")) .evaluate("selectRow(row)") 

Ho avuto un altro bug in cui find_link su Chrome e Poltergeist non poteva fare clic su un tag A con un tag EM e del testo al suo interno, sebbene funzionasse bene in Firefox e rack_test. La soluzione era di sostituire click_link(link) con:

 find('a em', text: link).click 

In Visual Studio 2013, se si triggers BrowserLink, viene visualizzata una barra di navigazione BrowserLink nella parte inferiore dello schermo. Se l’elemento che si desidera fare clic si trova dietro la barra di navigazione, fornisce l’errore. Disabilitare BrowserLink ha risolto il problema per me.