2012-08-12 3 views
5

ottengo un elemento non è visibile l'errore:errore cercando di accedere alla pagina web utilizzando il selenio con Python

ElementNotVisibleException: Message: u'Element is not currently visible and so may 
not be interacted with' 

Per ogni linea elemento trovare quando si esegue questo codice:

from selenium import webdriver 
browser = webdriver.Firefox() 
browser.get('http://www.example.com') 
browser.find_element_by_name('username').send_keys('myusername') 
browser.find_element_by_name('password').send_keys('mypassword') 
browser.find_element_by_class_name('welcomeLoginButton').click() 

Il codice HTML per la sezione di accesso della pagina appare così:

<div class='welcomeLoginUsername'> 
<div class='welcomeLoginUsernameLabel'><b>Username:</b></div> 
<div class='welcomeLoginUsernameInput'><input type='text' name='username' tabindex='1'> 
<br><a class='sf' href='javascript: void(0);' onclick='showUsernamePopup();'> 
<b>Forgot Username?</b></a> 
</div> 
</div> 
<div class='welcomeLoginPassword'> 
<div class='welcomeLoginPasswordLabel'> 
<b>Password:</b> 
<br><span class='sf'>(It's cAsE sEnSitIvE!)</span> 
</div> 
<div class='welcomeLoginPasswordInput'> 
<input type='password' name='password' tabindex='2'> 
<br><a class='sf' href="javascript: void(0);" onclick="showPasswordPopup();"> 
<b>Forgot Password?</b></a> 
</div> 
</div> 
</div> 
<input type="submit" value="" class='welcomeLoginButton' style='border: 0px; 
padding: 0px; margin: 0px;) no-repeat;' onclick='document.forms["login"].submit()'> 

risposta

6

Il selenio interagisce con il browser web in modo simile all'utente voluto. Quindi se c'è un elemento html che stai cercando di interagire con quello non è visibile allora la spiegazione più semplice è che quando stai scrivendo il tuo codice del selenio non stai interagendo con la pagina web come farebbe un utente normale.

Alla fine non si tratta dell'HTML della tua pagina web, ma del DOM e dell'attributo nascosto di un elemento. Ti suggerisco di scaricare firebug o qualche altro programma html viewer, quindi evidenzia il pulsante che vuoi premere. Utilizzare la ricerca DOM per il visualizzatore html e passare manualmente alla procedura di accesso. Nota cosa devi fare per rendere l'elemento visibile per interagire con esso, quindi imitare gli stessi passaggi nel codice del selenio.

Se si tratta del fatto che hai fatto tutto ciò che dovevi fare, ma il selenio interagisce con la pagina web più velocemente di quanto javascript renderà visibile l'elemento allora c'è un'attesa in cui devi essere programmato.

modo ingenuo:

import time 
time.sleep(1) # this is done in seconds 

maniera più scalabile:

import time 

welcome_button = browser.find_element_by_class_name('welcomeLoginButton') 

wait_for_element_visibility(welcome_button).click() 

def wait_for_element_visibility(element): 
    if element.is_visible(): 
     return element 
    else: 
     for i in range(10): 
     if not element.is_visible(): 
      time.sleep(.5) 
     else: 
      return element 
+6

si potrebbe usare [ 'WebDriverWait() until' o' browser.implicitly_wait (1) '.] (http: // seleniumhq.org/docs/ 04_webdriver_advanced.html) invece di 'time.sleep()'. – jfs

+0

Dopo aver seguito il tuo consiglio Firebug ho cambiato il codice di seguito:. browser.find_element_by_class_name ('welcomeLoginUsernameInput') find_element_by_name ('username') send_keys ('username') browser.find_element_by_class_name ('welcomeLoginPasswordInput') find_element_by_name.. ('password'). send_keys ('password') browser.find_element_by_class_name ('welcomeLoginButton'). click() non ottengo un elemento non visibile errori più e fa clic sul pulsante di invio, ma per qualche motivo il suo non inserire il nome e la password nei campi di inserimento. – Frozsht