我收到一个元素不可见的错误:
ElementNotVisibleException: Message: u'Element is not currently visible and so may not be interacted with'
对于运行此代码时的每个find元素行:
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()'>
Selenium与用户与Web浏览器的交互方式类似。因此,如果您尝试与之交互的html元素不可见,那么最简单的解释是,当您编写硒代码时,您不会像普通用户那样与网页进行交互。
最后,这与网页的html无关,与DOM和元素的hidden属性无关。我建议您下载Firebug或其他一些html查看器程序,然后突出显示要按下的按钮。对html查看器使用DOM查找,并手动完成登录过程。注意您必须要做的是使元素可见以便与之交互,然后模仿硒代码中的相同步骤。
如果您确实做了所有必要的事情,但是硒与网页的交互速度比javascript使元素可见的速度快,那么您就需要进行编程了。
天真的方法:
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