2016-02-25 8 views
9

Durante l'esecuzione di test Selenium sul mio progetto Django, ho iniziato a ottenere l'errore:Selenio: elemento non cliccabile ... altro elemento riceverebbe Clicca

selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point (61, 24.300003051757812). Other element would receive the click: <a class="navbar-brand" href="#"></a> 

E 'strano per due ragioni: in primo luogo, i test sono passati in precedenza e non ho modificato quella parte del codice di base. In secondo luogo, quando si apre la finestra di Firefox basata su selenio e io massimizzo la pagina, i test passano. Ma quando lascio che i test Selenium funzionino con il browser Firefox non massimizzato, falliscono.

Non sto utilizzando alcun javascript di fantasia (solo il modello Bootstrap 3 di base), solo semplice vecchio html e css. Sto usando Django 1.9 su Python 3.4. Ho eseguito pip per verificare gli aggiornamenti a Selenium e sono aggiornato.

Here is a pastebin link per l'html dell'output della visualizzazione personale e del modello.

Uno dei test fallimento è:

def test_create_task_and_check_that_it_shows_up_in_the_task_manager_index_and_filter(self): 
     # Create user 
     self.user = User.objects.get(username=test_superuser_username) 
     # Log the user in 
     self.log_user_in(user_object=self.user, password=test_superuser_password) 
     self.browser.implicitly_wait(10) 
     # Pull up the main task manager page 
     self.browser.get(str(self.live_server_url) + reverse('task_manager:index')) 
     # Make sure we go to the task manager index 
     task_index_url = str(self.live_server_url) + reverse('task_manager:index') 
     self.browser.get(task_index_url) 
     self.browser.implicitly_wait(4) 
     self.assertTrue(str(task_index_url) == self.browser.current_url, 
         msg=('Assertion that current_url is %s failed. Current_url is %s' % 
          (str(reverse('task_manager:index')), self.browser.current_url))) 
     # Click the 'add task' button on the sidebar 
     add_task_taskbar_button = self.browser.find_element_by_name('add_task_sidebar_link') 
     add_task_taskbar_button.click() 

L'ultima riga genera l'errore:

ERROR: test_create_task_and_check_that_it_shows_up_in_the_task_manager_index_and_filter (tasks.tests.test_functional.SeleniumTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/mint/Python_Projects/[project_name]/tasks/tests/test_functional.py", line 94, in test_create_task_and_check_that_it_shows_up_in_the_task_manager_index_and_filter 
    add_task_taskbar_button.click() 
    File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/selenium/webdriver/remote/webelement.py", line 75, in click 
    self._execute(Command.CLICK_ELEMENT) 
    File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/selenium/webdriver/remote/webelement.py", line 469, in _execute 
    return self._parent.execute(command, params) 
    File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/selenium/webdriver/remote/webdriver.py", line 201, in execute 
    self.error_handler.check_response(response) 
    File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point (61, 24.300003051757812). Other element would receive the click: <a class="navbar-brand" href="#"></a> 
+0

Fatemi sapere se il sotto va bene - upvote/contrassegno come risposta –

risposta

5

tua risposta si trova all'interno della vostra domanda.

  1. Errore dice 'add_task_sidebar_link' not clickable at point - (61, 24.300003051757812) Questo è dove un altro elemento è - Other element would receive the click: <a class="navbar-brand" href="#"></a> in cui viene tentata il clic. Dal momento che non hai massimizzato il browser, non sei in grado di ottenere correttamente le coordinate.
  2. Affinché i test futuri non si interrompano, i pls scorrono fino a quell'elemento. Fare riferimento a questo post (Selenium python unable to scroll down). Check Action chains (http://selenium-python.readthedocs.org/api.html#module-selenium.webdriver.common.action_chains)
+0

dovrei scorrere sempre di un elemento con selenio quando ho intenzione di chiamare il click() metodo su di esso? O solo quando ho questo errore? – jejy2343

+0

Credo che l'ultimo selenio scorrerà automaticamente. –

0

Questo ha più a che fare con elementi che si "coprono" l'un l'altro. Il che ha senso se succede su finestre non massimizzate. Potrebbe anche accadere se ci fosse un div in popup/floating o un altro elemento che copre l'elemento in cui stai effettivamente provando a fare clic.

Ricordare che il selenio imita l'utente, quindi non è possibile eseguire normalmente un'azione che l'utente non sarebbe stato in grado di fare, ad esempio fare clic su un elemento coperto da un altro.

Un potenziale soluzione per questo sarebbe utilizzare Javascript per trovare l'elemento e fare clic su di esso. Example here:

labels = driver.find_elements_by_tag_name("label") 
inputs = driver.execute_script(
    "var labels = arguments[0], inputs = []; for (var i=0; i < labels.length; i++){" + 
    "inputs.push(document.getElementById(labels[i].getAttribute('for'))); } return inputs;", labels) 
+0

@ aneroide Se sopra è vero - i test ** dovrebbero probabilmente fallire **. @ jejy2343 - Quanto sopra conferma un difetto di codice nella tua applicazione. Sto indovinando quando non massimizzi i tuoi elementi dovrebbero essere automaticamente 1. scorrere e mantenere la sua estensione verticale/orizzontale o 2. riorganizzarsi - applicabile per l'interfaccia utente Web multipiattaforma. O uno di loro dovrebbe accadere. Quando usi la risposta di cui sopra usando Javascript, stai passando un potenziale controllo di salute e bypassando quel difetto. Potrebbe anche essere vero il contrario: il tuo caso di test è potenzialmente insufficiente se hai provato a fare clic su di esso. –

+0

Lemme riepilogare sopra: un'interfaccia utente Web non deve sovrapporre gli elementi in cui un utente sta tentando di utilizzarlo. Direi che può essere considerato un difetto Look and Feel –

+0

Grazie per la risposta rapida. Penso che quello che potrebbe accadere è che quando la finestra di Firefox non è ingrandita, scorre verso il basso fino a dove il link si trova nell'angolo in alto a sinistra. Ma la barra di navigazione è impostata per essere nella parte superiore della pagina, anche quando si sta scorrendo, quindi è anche nell'angolo in alto a sinistra. Questa è una supposizione: non sono esattamente sicuro di come il selenio gestisca lo scrolling quando si selezionano i link. – jejy2343

0

Nel mio progetto Capybara corrente, spesso ricevo "Elemento non cliccabili" errori. La ragione di questo tipo di errore è che la pagina web non carica abbastanza bene da localizzare l'elemento. Come lei ha detto che i test precedentemente passati e non hanno cura che una parte della base di codice, quindi è possibile fare le seguenti cose per ottenere passare attraverso questa:

  1. Metti un po 'più di tempo di attesa prima di localizzare "add_task_sidebar_link ". In modo che la pagina si carichi completamente.
  2. Ancora se il test fallisce anche dopo aver aggiunto wait, quindi aggiungere un metodo per fare screenshot prima di fare clic sull'elemento. Questo aiuterà il debug del test.
0

Da poco il driver di Firefox verifica che l'elemento nella posizione di selezione sia l'elemento che si suppone debba essere cliccato. Questo errore indica che quando il driver tenta di fare clic sull'elemento, ne sopra un altro. Purtroppo, il driver non scorre automaticamente i contenitori e alza questo errore.

Il modo per gestire questo problema è far scorrere l'elemento al centro dello schermo e provare a fare nuovamente clic. toppa Scimmia per il metodo click:

JS_SCROLL_ELEMENT_CENTER_WINDOW = """\ 
    var element = arguments[0]; 
    element.scrollIntoView(true); 
    var y = (window.innerHeight - element.offsetHeight)/2; 
    if (y > 0) { 
    for (var e=element; e; e=e.parentElement) { 
     if (e.scrollTop) { 
     var yy = Math.min(e.scrollTop, y); 
     e.scrollTop -= yy; 
     if ((y -= yy) < 1) 
      return; 
     } 
    } 
    window.scrollBy(0, -y); 
    } 
    """ 

def click(self): 
    try: 
    self._execute(Command.CLICK_ELEMENT) 
    except: 
    self._parent.execute(Command.EXECUTE_SCRIPT, \ 
     {'script': JS_SCROLL_ELEMENT_CENTER_WINDOW, 'args': [self]}) 
    self._execute(Command.CLICK_ELEMENT) 

from selenium.webdriver.remote.webelement import WebElement 
from selenium.webdriver.remote.command import Command 
WebElement.click = click 
8

estremamente in ritardo alla festa, ma io ho una soluzione estremamente semplice che ha lavorato per me. Invece di fare .click(), è sufficiente fare

.send_keys(selenium.webdriver.common.keys.Keys.SPACE) 

Con l'elemento selezionato, la barra spaziatrice può commutare la selezione. Ha funzionato per me!

+0

Grazie per questo, mi ha fatto impazzire per l'intera mattinata e questo l'ha risolto. –

+0

Tu sei l'uomo/donna. – Speakeasys

2

Si è verificato un problema simile (lo stesso errore) e ha provato la soluzione del Major Major sopra utilizzando send_keys + inviando la barra spaziatrice per simulare un clic piuttosto che un clic del mouse.

soluzione del Maggiore Maggiore:

.send_keys(selenium.webdriver.common.keys.Keys.SPACE) 

mi ha colpito un nuovo errore nel tentativo di eseguire questo, indicando 'il selenio'. Rimozione di quella parola chiave dal codice risolto il problema, e mi ha permesso di fare clic sull'elemento.

finale di codice di successo frammento utilizzato:

my_variable = driver.find_element_by_xpath('//*[@id="myId"]') #this is the checkbox 
my_variable.send_keys(webdriver.common.keys.Keys.SPACE) 
0

Ho avuto lo stesso problema: a causa di una finestra pop-up, l'elemento che ho dovuto cliccare sul sarebbe alla deriva fuori dallo schermo e diventare cliccabile.

Scorrimento della pagina sull'elemento lavorato.

In Python:

elem = driver.find_element_by_tag_name("html") 
elem.send_keys(Keys.END) 
Problemi correlati