selenium无法定位chrome的特殊弹窗

用selenium实现chrome自动化登录时,有时候会出现弹窗无法识别抓取定位的情况。
弹窗样式如下:无法识别的弹窗
1.识别移动到弹窗,检查元素,无法显示使用,弹窗不在前端页面中
2.网上都说可能是alert,confirm和promte这三种弹窗,可以用driver.switch_to.alert切换到到弹窗,但是仍然会报错

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

成功解决