selenium之网页密码控件无法定位输入解决办法

背景

在进行selenium进行网页自动化的时候,当涉及到密码控件的时候,就会发现密码控件无法通过F12定位到,也就是无法通过selenium定位元素。

解决思路

由于涉及到控件,无法通过网页定位,那么只能曲线救国了。

在我们人工处理的这种登陆页面的时候,可以通过键盘输入tab键来切换到密码框。

所以规避办法是,直接无视selenium,我们通过直接控制键盘,模拟输入

输入tab键来切换当前元素到密码框

再输入密码

最后回到selenium点击提交按钮。

那么怎么直接模拟键盘输入呢?

在python中,第三方库:PyUserInput提供了鼠标和键盘输入功能。

实现办法

根据上述思路,实现步骤如下

  • 安装PyUserInput库
  • 初始化键盘对象
  • selenium定位到用户名元素,输入用户名
  • 模拟键盘输入tab,使定位到密码控件
  • 模拟键盘输入密码
  • selenium定位到提交按钮,点击提交

实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from selenium import webdriver
from pykeyboard import PyKeyboard
from time import sleep

username = ''
password = ''
k = PyKeyboard()
driver = webdriver.Ie()
# 省略打开页面代码
driver.find_element_by_id('userName').send_keys(username)
k.tap_key(k.tab_key)
sleep(1)
for char in password:
k.tab_key(char)
sleep(1)
driver.find_element_by_id('login').click()

注意:

上述代码里,每使用PyKeyboard()输入一次,都暂停1秒,那是因为测试发现直接输入的话,可能会存在异常,或输入失败的情况。

虽然PyUserInput提供了PyKeyboard.type_string()的方法用于直接输入字符串,但在控件的场景下会输入失败。估计是因为控件还需要处理加密的关系吧。

扩展

PyUserInput库的详细介绍可参考:https://pypi.org/project/PyUserInput/

在安装时,MAC OS直接通过pip安装即可:

1
pip install PyUserInput

但Windows系统直接pip安装会有报错提示:

1
2
  Could not find a version that satisfies the requirement pyHook (from PyUserInput) (from versions: )
No matching distribution found for pyHook (from PyUserInput)

根据提示,需要先安装pyHook,但是使用pip安装就会提示找不到对应的包:

1
2
  Could not find a version that satisfies the requirement pyHook (from versions: )
No matching distribution found for pyHook

需要手动在官网:https://sourceforge.net/projects/pyhook/ 中下载

不过建议直接在如下网站下载编译好的whl文件:

https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyhook

安装whl文件命令为:

1
pip install xxx.whl

先安装好pyHook在安装PyUserInput即可。