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

标签 python selenium authentication

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

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

最佳答案

Selenium 以与用户相似的方式与 Web 浏览器交互。因此,如果您尝试与之交互的 html 元素不可见,那么最简单的解释是,当您编写 selenium 代码时,您不会像普通用户那样与网页交互。

最后,这与您网页的 html 无关,而与 DOM 和元素的隐藏属性有关。我建议您下载 firebug 或其他一些 html 查看器程序,然后突出显示您要按的按钮。使用 html 查看器的 DOM 查找并手动完成登录过程。请注意您必须执行哪些操作才能使元素可见以便与其交互,然后在您的 selenium 代码中模仿相同的步骤。

如果事实上您已完成所有需要做的事情,但 selenium 与网页交互的速度比 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

关于python - 尝试使用 selenium 和 python 登录网页时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11918735/

相关文章:

python - 如何解决 selenium webdriver 中的斜线问题?

c# - 如何使用selenium Web驱动程序来引用Web浏览器的运行实例?

Asp.net core 2 AuthenticationProperties 存储 jwt token

java - Java 和 Python 的最佳 GUI 工具包/框架

python - 简单的 "blurring"数组表示来自第一原理的 python 中的图像

python - 如何使用Python增加乒乓球的摩擦力?

python - Django VMware 设备

javascript - 从 Protractor 库 4.0.1 中的 elements.all.each 获取最终值

python - Scrapy Spider 验证和迭代

google-app-engine - Grails App Engine 身份验证