Errore di debug "L'elemento non è selezionabile al punto"


397

Vedo questo solo in Chrome.

Il messaggio di errore completo dice:

"org.openqa.selenium.WebDriverException: l'elemento non è selezionabile nel punto (411, 675). L'altro elemento riceverebbe il clic: ..."

L'elemento che "riceverebbe il clic" è sul lato dell'elemento in questione, non sopra di esso e non sovrapposto, non spostandosi all'interno della pagina.

Ho provato ad aggiungere un offset, ma neanche quello funziona. L'elemento si trova nella finestra visualizzata senza necessità di scorrimento.


2
Attendi il caricamento della pagina? Forse un altro elemento si sovrappone durante il caricamento della pagina?
Herokiller,

55
Per farla breve per coloro che stanno appena arrivando - L'ELEMENTO NON È VISIBILE IN PAGINA E QUINDI NON È CLICCABILE. È NECESSARIO SCORRIRE IL VIEWPORT EMETTANDO window.ScollTo.
Chris B. Behrens,

67
@ ChrisB.Behrens Questo non è sempre il caso. Questo particolare errore può essere dato anche quando un elemento è coperto da un altro. Ho avuto questa eccezione quando ho provato a fare clic su un pulsante che era un altro elemento con posizione fissa.
Martin Cassidy,

4
Non è solo Chromedriver- ha avuto lo stesso problema con Firefox. Ho risolto il problema implementando un ritardo nell'attesa che la pagina si ricaricasse completamente, come suggerito da altri sopra.
codervince il

5
Penso che questo sia un consiglio assolutamente sbagliato di emettere scrollTo o di attendere. Sembra che l'algoritmo del clic di selenio sia: 1. calcola la posizione dell'elemento 2. scorri fino a questa posizione (quindi non devi emetterla tu stesso) 3. fai clic su questa posizione (l'eccezione proviene dall'ultima affermazione che controlla quale elemento si trova su questo posizione appena prima dell'invio effettivo dell'evento click) I miei consigli sono: 1. controlla se l'elemento è all'interno del tuo viewport. 2. controlla se l'elemento è coperto da altri (come i menu appiccicosi), nascondili se ce ne sono o scorri manualmente prima di fare clic senza fare affidamento sullo scorrimento incorporato
Vitalik Verhovodov,

Risposte:


325

Ciò è causato dai seguenti 3 tipi:

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

Utilizzare Actions o JavascriptExecutor per fare 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 questo, fai aspettare la pagina per alcuni secondi.

3. L'elemento è cliccabile ma sopra c'è uno spinner / overlay

Il codice seguente attenderà fino alla scomparsa della sovrapposizione

By loadingImage = By.id("loading image ID");

WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);

wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));

Quindi fare clic sull'elemento.


52
Esiste un terzo tipo di causa, ovvero che l'elemento è racchiuso in un div o in un intervallo. La pagina può essere caricata completamente e completamente all'interno del viewport, ma Chromedriver rifiuterà di fare clic su di essa, in cui il webdriver per FF e IE non ha alcun problema. Un vero essere umano non ha idea dell'esistenza dell'intervallo e al browser non importa quando lo si fa effettivamente clic, come essere umano. Né muoversi, né aspettare risolverà questo problema; o evitare Chrome / chromedriver o riscrivere l'HTML della pagina sembra essere l'unica opzione per le persone nel caso 3.
Don Simon,

54
@DonSimon Ho avuto lo stesso problema che hai fatto tu. Sono stato in grado di aggirare il problema utilizzando .SendKeys (Keys.Return) anziché .Click. Questo ha funzionato per me in Chrome, dove stavo riscontrando questo problema e in Firefox, dove stavo riscontrando un altro problema simile su questo particolare link (anchor racchiuso in un Div).
Peter Bernier,

17
La soluzione suggerita da @PeterBernier funziona bene nel caso in cui l'elemento sia racchiuso in un div o in un intervallo. In Python ho usato .send_keys ('\ n') per simulare il clic e aggirare il problema in Chrome.
GJ,

4
Se un elemento è nascosto da un elemento div, il codice seguente lo risolve. executeJavascript ("argomenti [0] .click ();", selenium.findElement (localizzatore));
EsotericNonsense,

Puoi anche attendere che l'elemento sia cliccabile. wait.Until (ExpectedConditions.ElementToBeClickable (webElement));
Chielus,

67

È inoltre possibile utilizzare il clic JavaScript e lo scorrimento non sarebbe necessario.

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

5
Incredibile! Mi chiedo perché il selenio non elimini il metodo click () che forniscono, dato che ci sono condizioni in cui isDisplayed () e isEnabled () non sono sufficienti per fare clic su un elemento, e questa sembra l'unica soluzione. Grazie!
Giovanni Bitliner,

2
+1: questa è la soluzione che ha funzionato per me. actions.MoveToElementnon ha funzionato per me in C # e le altre soluzioni di scorrimento sembravano un po 'fragili in quanto c'era una possibilità che lo scorrimento non potesse visualizzare correttamente l'elemento o che la posizione dell'elemento sulla pagina potesse cambiare.
Utente

1
questa soluzione è la più semplice se l'elemento non è in vista, ma esiste nella pagina
Yashveer Rana

@Giovanni Bitliner Non forniscono questo metodo poiché non è un vero scenario utente. Gli utenti dovrebbero anche attendere fino alla scomparsa del caricatore. Penso che sia una cosa meravigliosa del selenio.
Gideon Mulder,

+1 Ha funzionato anche per me. Ho appena aggiunto il metodo flwg al mio codice: `private void jsClick (elemento IWebElement, driver IWebDriver) {IJavaScriptExecutor ex = (IJavaScriptExecutor) driver; ex.ExecuteScript ("argomenti [0] .click ();", elemento); } `invocato in questo modo: 'jsClick (driver.FindElement (By.XPath (" xpathOfTheElement "))); `
Jeremias,

46

Sembra che ci sia un bug in chromedriver per questo (il problema è che è contrassegnato come non risolto) -> GitHub Link

(piazzare una taglia su FreedomSponsors forse?)

C'è una soluzione alternativa suggerita al commento # 27. Forse funzionerà per te-


4
Sembra giusto - se il pulsante non è sullo schermo, non è realmente selezionabile.
Evan Knowles,

Questo non è un bug. Questo è un comportamento previsto ed è corretto. Come altri hanno suggerito, se l'elemento è al di fuori del viewport, è necessario scorrere fino ad esso.
Alex Skrypnyk,

Ho provato Firefox e ho scoperto che non dava questo errore, ma il clic era ancora ignorato. Si è scoperto che il div di un genitore aveva un'altezza pari a zero. Una volta risolto il problema, entrambi hanno funzionato bene.
dansalmo,

35

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 sia di aiuto


16

L'ho visto nella situazione in cui la finestra di Chrome guidata dal selenio era aperta troppo piccola. L'elemento su cui fare clic era fuori dal riquadro di visualizzazione e pertanto non funzionava.

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

Dopo aver incaricato il driver del selenio di impostare le dimensioni della finestra in modo appropriato, questo problema è andato via per me. L'API webdriver è descritta qui .


15

Wow, molte risposte qui e molte buone.

Spero di aggiungere qualcosa a questo dalla mia esperienza.

Bene ragazzi, nel mio caso c'era un overlay di cookie che nascondeva l'elemento di tanto in tanto. Anche scorrere fino all'elemento funziona; ma secondo il mio modesto parere (nel mio caso, non una panacea per tutti) la soluzione più semplice è quella di passare a schermo intero (stavo eseguendo i miei script su un 3/4 della finestra dello schermo)! Quindi eccoci qui:

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

Spero che aiuti!


13

ruby / watir-WebDriver / cromo

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

1
Il problema che stavo vedendo era con una mappa dell'area. L'errore era lo stesso del post originale qui - un div "davanti" all'area che dovevo fare clic. Non si trattava di un problema di AJAX / temporizzazione / caricamento della pagina e l'area era in piena vista: non riuscivo nemmeno a scorrere per concentrarmi su di essa. Tuttavia, la modifica del metodo del clic da object.click a object.fire_event ("clic") sembra aver risolto il problema per me. L'ho lasciato in un blocco di avvio / salvataggio in modo che non influisse sul modo in cui Firefox fa clic normalmente.
Adam Reed,

Questo approccio ha risolto il problema per me quando c'erano elementi non visibili nella finestra.
Jason R. Coombs,

13

Anch'io ho lottato con questo problema. Il codice funziona bene in FF, non riesce su Chrome. Quello che stavo cercando di fare era fare clic su una casella di spunta: se non fosse in vista, scorrerei 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, quindi il webdriver si è rifiutato di fare clic su di esso.

La mia soluzione alternativa è 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'uso delle azioni è talvolta necessario. Ovviamente, devi sapere in quale direzione e quanto devi andare, quindi il tuo chilometraggio può variare. Ma preferisco questo all'hacking di JavaScript, quindi lo sto pubblicando qui nel caso in cui qualcun altro lo ritenga utile.


Localizzabile è obsoleto.
Steve Staple,

12

Stavo ottenendo questo errore durante l'esecuzione di test senza testa con xvfb-run. Lavoravano perfettamente a livello locale. Usando chrome, le versioni di webdriver / chromedriver / chrome / java ecc. Sono tutte identiche.

Il bug "non risolve" in chromedriver - GitHub Link sottolineato da Tony Lâmpada ha suggerito che ciò 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")

La modifica della risoluzione per xvfb ha fatto scomparire l'errore:

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

9

Quando ho usato Protractor questo mi ha aiutato:

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

8

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

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

Passaggio 1: concentrarsi sull'elemento utilizzando l'oggetto Azioni selenio,

Passaggio 2: quindi fare clic sull'elemento

Passaggio 3: Se esiste un'eccezione, viene attivato 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 funzionerebbe da solo, ma ho notato un comportamento strano in uno scenario in cui il passaggio 3, anche se ha fatto clic con successo 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();");

            }

Stavo avendo lo stesso problema. Il passaggio 1 dell'utilizzo della classe Actions funziona alla grande. Non ci avrei mai pensato. Grazie!
Conner,

Il tuo primo passo è un'ottima soluzione.
Sovandara LENG

7

Ho fatto questo metodo basandomi su un commento della 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

6

Stavo riscontrando lo stesso problema durante l'esecuzione dello script di selenio in Python. Ecco cosa ho usato per fare clic sull'elemento:

from selenium.webdriver.common.action_chains import ActionChains


ActionChains(driver).click(element).perform()

5

Stavo affrontando un problema simile dove devo selezionare due caselle di controllo una dopo l'altra, ma ho riscontrato lo stesso errore sopra. Quindi ho aggiunto attendere tra i miei passaggi per controllare le caselle di controllo .... funziona benissimo. ecco i passaggi: -

  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

Aggiungo solo che questo non è il modo corretto di usare la sintassi di Gherkin. I passaggi dovrebbero essere nella forma "dato - quando - allora" e questi non dovrebbero essere mescolati. Se dopo "allora" sono necessari più "whens", probabilmente è necessario un caso di test separato.
Floella,

5

Devi usare lo stato attivo o scorrere su quell'elemento. Potrebbe anche essere necessario utilizzare explict wait.

WebElement firstbutton= driver.findElement(By.xpath("Your Element"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();

O

L'elemento non è selezionabile a causa di uno Spinner / Overlay sopra di esso:

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

O

Point p= element.getLocation();
Actions actions = new Actions(driver);
actions.moveToElement(element).movebyoffset(p.x,p.y).click().perform();

O

Se ancora non funziona, utilizzare JavascriptExecutor

JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", firstbutton);

3

Apparentemente questo è il risultato di un bug "Won't Fix" nel binario del driver Chrome.

Una soluzione che ha funzionato per me (il nostro chilometraggio può variare) 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 risolto il problema navigando direttamente sull'href dell'ancoraggio principale dell'intervallo.

. 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 aspetterei che funzioni solo se l'elemento su cui stai tentando di fare clic è un collegamento ...


3

Stavo affrontando lo stesso problema con clj-webdriver (clojure port of Selenium). Ho appena tradotto la soluzione precedente in clojure per comodità. È possibile chiamare questa funzione prima di fare clic o qualsiasi altra cosa per evitare quel 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))))

3

Ciò può accadere se l'elemento cambia posizione mentre il driver sta tentando di fare clic su di esso (l'ho visto anche con IE). Il driver mantiene la posizione iniziale ma quando riesce effettivamente a fare clic su di essa, quella posizione non punta più a quell'elemento. Il driver FireFox non ha questo problema a proposito, a quanto pare "scatta" elementi a livello di codice.

Ad ogni modo, ciò può accadere quando si utilizzano le animazioni o si modifica semplicemente l'altezza degli elementi in modo dinamico (ad es $("#foo").height(500).). Devi assicurarti di fare clic sugli elementi solo dopo che la loro altezza è "stabilizzata". Ho finito con un codice simile al seguente (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 il quale non è possibile eseguire una query, è possibile utilizzare un metodo "generico" che attende che l'elemento sia fermo:

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

Questo sembra essere quello che sto vivendo. Ricevo in modo intermittente l'eccezione "Altro elemento ..." dell'OP, ma gli screenshot mostrano che il modale è sullo schermo e l'elemento non è coperto e utilizzo le attese prima di fare clic. Si scopre quando il modale che sto facendo clic si apre in realtà scorre verso il basso la pagina. A seconda di quando il selenio attende i campioni effettivi del DOM, l'eccezione può essere generata se ha catturato il modale mentre si muoveva.
Levi Noecker,

3

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!


3

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 temporaneo non visibile.

Potrebbero esserci molte ragioni per cui l'elemento non è visibile nel momento del test. Analizza nuovamente la tua pagina e trova la soluzione adeguata per il tuo caso.

Soluzione per casi particolari :

Nel mio caso, questo errore si verifica quando una descrizione dell'elemento dello schermo su cui ho appena fatto clic si apriva sull'elemento su cui volevo fare clic. Defocus era una soluzione di cui avevo bisogno.

  • Una rapida soluzione su come defocus sarebbe quella di fare clic su un altro elemento in un'altra parte dello schermo che non fa "nulla" resp. non succede nulla dopo un'azione di clic.
  • La soluzione corretta sarebbe quella di richiamare element.blur()l'elemento che popola la descrizione comando, il che renderebbe scomparsa la descrizione comando.

3

Il motivo di questo errore è che l'elemento su cui si sta tentando di fare clic non si trova nella finestra (area visualizzata dall'utente) del browser. Quindi il modo per ovviare a questo è scorrendo prima l'elemento desiderato e quindi eseguendo il clic.

Javascript:

async scrollTo (webElement) {
    await this.driver.executeScript('arguments[0].scrollIntoView(true)', webElement)
    await this.driver.executeScript('window.scrollBy(0,-150)')
}

Giava:

public void scrollTo (WebElement e) {
    JavascriptExecutor js = (JavascriptExecutor) driver; 
    js.executeAsyncScript('arguments[0].scrollIntoView(true)', e)
    js.executeAsyncScript('window.scrollBy(0,-150)')
}

2

Per quanto riguarda la risposta di Tony Lâmpada, il commento n. 27 mi ha davvero risolto il problema, tranne per il fatto che forniva 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 ha risolto il problema per me in Chrome 34.0. Non ha causato alcun danno in Firefox 28.0 e IE 11; questi browser non sono soggetti al problema, ma scorrere fino alla posizione dell'elemento prima di fare clic su di esso non è ancora una cosa negativa.


2

Forse non è una soluzione davvero 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

2

Stavo ricevendo questo errore perché ho testato un passaggio del mouse e quindi avevo bisogno di fare clic sul collegamento sotto la descrizione comandi. La soluzione era aggiungere page.find('.sp-logo').hoverprima click_linkper rimuovere il tooltip.


2

È divertente, per tutto il tempo che ho passato a guardare le varie risposte, nessuno aveva provato l'ovvio, cosa che ovviamente non avevo fatto neanche io. Se la tua pagina ha lo stesso ID usato più volte, come la mia, ("newButton",) e quello che desideri non è il primo trovato, allora con ogni probabilità otterrai questo errore. La cosa più semplice da fare (C #):

var testIt = driver.FindElements(By.Id("newButton"));

Nota che è FindElements, non FindElement.

E quindi prova per vedere quanti risultati sono stati restituiti dal recupero. Se è il secondo, è quindi possibile utilizzare:

testit[1].Click();

O ottenere chiunque abbia riutilizzato gli ID per risolverli.


Se questo è perché ci sono più pulsanti per quell'ID e ne viene visualizzato solo uno alla volta, una soluzione superiore prevede l'uso di LINQ per trovare il primo elemento visibile (aggiungere .First(x => x.Visible)alla chiamata FindElements) e fare clic su di esso se non è null.
Sean Duggan,

2

Dopo aver testato tutti i suggerimenti citati, nulla ha funzionato. Ho creato 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();
            }
        }
    }
}

2

Faccio una specie di forza bruta di clic e funziona per me.

try:
    elem.click()
except:
    print "failed to click"
    size = elem.size
    mid_of_y = int(size["height"])/2
    stepts_to_do_to_left = int(size["width"])
    while stepts_to_do_to_left > 0:
        try:
            print stepts_to_do_to_left, mid_of_y
            action = webdriver.common.action_chains.ActionChains(driver)
            action.move_to_element_with_offset(elem, mid_of_y, stepts_to_do_to_left)
            action.click()
            action.perform()
            print "DONE CLICK"
            break
        except:
            pass

2

Se hai jQuerycaricato sulla pagina, puoi eseguire il seguente comando javascript:

"$('#" + element_id + "').click()"

Esempio con l'esecuzione di python:

driver.execute_script("$('#%s').click()" % element_id)

1

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

Prima:

<div id="logout"><a id="logout" href="logoutLink">logout</a></div>

Dopo:

<div id="differentId"><a id="logout" href="logoutLink">logout</a></div>

Non sorpreso che ti abbia causato problemi. Dovrebbe esserci un solo ID su una pagina. Quello non stava svolgendo un cattivo design, ma una soluzione alternativa.
Dave Lawrence,

1

In Drupal quando si utilizza il selenio :

    // 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();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.