用selenium实现chrome自动化登录时,有时候会出现弹窗无法识别抓取定位的情况。
弹窗样式如下:
1.识别移动到弹窗,检查元素,无法显示使用,弹窗不在前端页面中
2.网上都说可能是alert,confirm和promte这三种弹窗,可以用
1 2 | raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoAlertPresentException: Message: no such alert |
3.all_h=driver.window_handles所有的串口句柄中也没有弹窗的窗口
4.后续更换IE浏览器发现,并没有类似的窗口弹出。因此断定这是chrome浏览器本身自带功能模块的弹窗,所以自然selenium无法从网站的web前端中捕获和定位。。。
有点神坑
解决方案:
1.换个浏览器(但是我的项目不允许)
2.用浏览器设置证书验证弹出框,可以参考
Chrome的权限参考网址:
https://developer.chrome.com/apps/declare_permissions(没有亲测,但是应该是可行的)
3.采用多线程的方式,在网站请求堵塞的同时,调用另一个线程,按enter键跳过弹窗进行到下一步。(之前安装过PyUserInput),所以此种方式比较方便,安装请参考
https://www.jianshu.com/p/95d0a6dd7d47
不可以直接使用
#ActionChains(driver).send_keys(Keys.ENTER).perform() :会阻塞
1 2 3 4 5 6 7 8 9 | from pykeyboard import PyKeyboard#导入键盘 import threading #导入多线程模块 def press_enter(): #定义子线程函数 time.sleep(10) #可以多等待几秒 k=PyKeyboard() #按下Enter键 k.press_key(k.return_key) # 其中return_key就是Enter键 #ActionChains(driver).send_keys(Keys.ENTER).perform() : #按下回车代码 |
主函数如下
1 2 3 4 5 | t = threading.Thread(target=press_enter) #初始化子线程 t.setDaemon(True) driver.get(url) #drver访问网址登陆页面 t.start() #子线程启动 driver.find_element_by_id("soft-pki-login").click() |
成功解决