2012-08-12 14 views
5

consigo un elemento que no es visible de error:Error al intentar acceder a la página web usando el selenio con el pitón

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

Para cada línea elemento de encontrar cuando corro este código:

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

El HTML para la sección de inicio de sesión de la página se ve así:

<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()'> 

Respuesta

6

Selenium interactúa con el navegador web de forma similar que el usuario haría. Entonces, si hay un elemento html con el que intentas interactuar y que no está visible, la explicación más simple es que cuando escribes tu código de selenio no estás interactuando con la página web como haría un usuario normal.

Al final, esto no se trata de que el html de su página web sea sobre el DOM y el atributo oculto de un elemento. Sugiero que descargue Firebug o algún otro programa de visor html y luego resalte el botón que desea presionar. Use la búsqueda DOM para el visor html y realice el proceso de inicio de sesión manualmente. Observe lo que tiene que hacer para que el elemento sea visible para interactuar con él y luego imite los mismos pasos en su código de selenio.

Si es una cuestión de hecho que hizo todo lo que tenía que hacer, pero el selenio está interactuando con la página web más rápido de lo que javascript lo hará visible, entonces hay una espera que debe programar.

manera Naive:

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

manera más escalable:

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

usted podría utilizar [ 'WebDriverWait() until' o' browser.implicitly_wait (1) '.] (http: // seleniumhq.org/docs/ 04_webdriver_advanced.html) en lugar de 'time.sleep()'. – jfs

+0

Después de seguir su consejo firebug he cambiado el código a la siguiente:. browser.find_element_by_class_name ('welcomeLoginUsernameInput') find_element_by_name ('nombre de usuario') send_keys ('nombre de usuario') browser.find_element_by_class_name ('welcomeLoginPasswordInput') find_element_by_name.. ('contraseña'). send_keys ('contraseña') browser.find_element_by_class_name ('welcomeLoginButton'). click() no consigo un elemento no visible de error más y se hace clic en el botón de enviar, pero por alguna razón su no ingresando el nombre y la contraseña en los campos de entrada. – Frozsht

Cuestiones relacionadas