2012-08-12 7 views
5

uzyskać element nie jest widoczny błąd:Błąd próbuje się zalogować do serwisu za pomocą selenu z Pythona

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

Dla każdego elementu wybrać linię, kiedy uruchomić ten kod:

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

HTML sekcja logowania na stronie wygląda następująco:

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

Odpowiedz

6

Selen współdziała z przeglądarką internetową w podobny sposób, jak użytkownik chciałbym. Więc jeśli istnieje element HTML, z którym próbujesz wejść w interakcję, który nie jest widoczny, najprostszym wyjaśnieniem jest to, że kiedy piszesz swój kod selenu, nie wchodzisz w interakcję ze stroną internetową, tak jak zwykły użytkownik.

Podsumowując, nie chodzi o to, że html twojej strony internetowej jest związany z DOM i ukrytym atrybutem elementu. Sugeruję pobranie firebuga lub innego programu przeglądarki HTML, a następnie zaznaczenie przycisku, który chcesz nacisnąć. Użyj wyszukiwania DOM dla przeglądarki HTML i ręcznie wykonaj proces logowania. Zwróć uwagę, co musisz zrobić, aby element był widoczny w celu interakcji z nim, a następnie naśladuj te same kroki w kodzie selenu.

Jeśli chodzi o to, że zrobiłeś wszystko, co musisz, ale selen wchodzi w interakcję ze stroną internetową szybciej niż javascript sprawi, że element będzie widoczny, a następnie musisz poczekać, aż będziesz musiał zaprogramować.

naiwny sposób:

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

Więcej skalowalny sposób:

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

można użyć [ 'WebDriverWait() until' lub' browser.implicitly_wait (1) '.] (http: // seleniumhq.org/docs/ 04_webdriver_advanced.html) zamiast 'time.sleep()'. – jfs

+0

Po wykonaniu twojej rady firebug zmieniłem kod na następujący:. browser.find_element_by_class_name ('welcomeLoginUsernameInput') find_element_by_name ('username') send_keys ('login') browser.find_element_by_class_name ('welcomeLoginPasswordInput') find_element_by_name.. ('hasło'). send_keys ('password') browser.find_element_by_class_name ('welcomeLoginButton'). click() dont dostać element już nie widoczny błąd i kliknie przycisk Prześlij, ale z jakiegoś powodu jego nie wpisywanie nazwy i hasła w polach wejściowych. – Frozsht

Powiązane problemy