尝试使用selenium和python登录网页时出错

时间:2012-08-12 00:16:45

标签: python selenium login

我得到的元素不可见错误:

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

对于运行此代码时的每个查找元素行:

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如下所示:

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

1 个答案:

答案 0 :(得分:6)

Selenium以与用户类似的方式与Web浏览器进行交互。因此,如果有一个你试图与之交互的html元素是不可见的,那么最简单的解释是,当你编写你的硒代码时,你不会像普通用户那样与网页交互。

最后,这不是关于网页的HTML,关于DOM和元素的隐藏属性。我建议您下载firebug或其他一些html查看器程序,然后突出显示您要按的按钮。对html查看器使用DOM查找并手动完成登录过程。注意你要做的就是让元素可见以便与它交互,然后模仿你的selenium代码中的相同步骤。

如果事实上你做了你需要做的所有事情,但是selenium与网页的交互速度比javascript使元素可见更快,那么你需要编程等待。< / p>

朴素的方式:

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

更具伸缩性的方式:

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