在使用python3+selenium写自动升级程序的时侯,碰到一个弹出对话框须要点击确认的场景。弹出的对话框以下图所示。html
对于弹框各类资料都说经过switch_to.alert属性获取对话框对象,而后使用该对象的accept()方法点击确认。python
但使用该方法,一直报错:“selenium.common.exceptions.NoAlertPresentException: Message: No alert is active”,截图以下:jquery
JavaScript中有三种基本的消息:警告框、确认框、提示框;分别使用alert()、confirm()、prompt()弹出;形式依次以下:web
对于这三种消息框,和网上大多数资料说的同样用以下几个方法进行处理:浏览器
# 定义浏览器 browser = webdriver.Firefox() # 打开url browser.get(url) # 切换至消息框,适用于alert/confirm/prompt alert_box = browser.switch_to.alert # 点击消息框的确认按钮,返回值为true。适用于alert/confirm/prompt alert_box.accept() # 点击消息框的取消按钮,返回值为False。适用于confirm/prompt alert_box.dismiss() # 向输入框发送内容,适用于prompt alert_box.send_keys("msg") # 获取输入框内容,适用于prompt alert_box.text
在理解中,非模态对话框是指不进行处理也能点击其余位置的对话框,模态对话框则是指不处理就不能点击页面其余位置的对话框。架构
按这定义,前面说的三种消息框也应该都算模态对话框;但我对html的一些术语不是很了解,反正咱们这里就约定剔除前面三种弹出形式、而后又须要进行处理才能点击页面其余位置的对话框称为模态对话框。框架
在第一大节中使用switch_to.alert之因此报错,是由于该对话框并非第二大节中所说的三种消息框,而是一个使用其余方法弹出的模态对话框(彷佛是jquery框架弹出的,细节没研究);模态对话框不能经过switch_to.alert获取。ide
在第一大节中能够看到,“OK”按钮处于激活状态,咱们正是要点击“OK”按钮,因此咱们可使用switch_to.active_element获取“OK”对象,而后进行点击。url
# 切换至激活状态控件 element = browser.switch_to.active_element # 调用click()方法点击该按钮 element.click()
在3.1中介绍的方法不够通用,假如“OK”不处于激活状态或者咱们要点击的是“Cancel”按钮,这种方法就行不通了。spa
第二大节介绍的三种消息对话框没有相应的html代码---即经过查看页面源代码看不到相应的html代码----但模态对话框在弹出时是有相应的html代码的(未弹出时没有),也就是说咱们彻底能够像获取普通控件同样,经过find_element_by_id()等方法获取控件对象。
如上能够看到“OK”控件id为“btnYO”,因此直接代码就是:
browser.find_element_by_id("btnYO").click()
前面所说的两种方法基本能够处理咱们如何关闭弹窗的问题,但一是咱们要判断对话框是什么对话框,二是在判断为模态对话框以后咱们还得进行点击查看源代码而后提取xpath等操做。
也许一次两次这样的操做工做量还可接受,但若是不少时就比较烦,咱们能够借助更轻松的方法实现;这种方法其实不仅对处理对话框,对使用selenium操做页面的代码的编写都是一种颇有用的方法。
那就是使用Selenium IDE的代码导出功能,使用Selenium IDE记录整个点击过程后,将过程导出为Python等语言的代码,咱们就能够轻松地知道想要的点击操做在代码上的实现;固然新版本的Selenium IDE导出代码已暂不可用(应该是Firefox等架构调整致使其原先代码不可用而新代码又没写好),但咱们可使用Katalon Recorder等代替品来实现。
固然,这也不是说之后你想写一个selenium操做页面的代码,都直接使用Katalon Recorder开启记录,而后把整个过程的操做一下,最后再导出代码就万事大吉了。主要是由于Katalon Recorder等并不能清楚地知道你进行下一步前的判断标准,也不知道异常以后你想进行的操做。好比你想等待一个按钮加载完可点击以后进行点击,若是不能点击就再等一下;但Katalon Recorder并不知道你的这个思想过程,他只以为整个过程就是你等了5秒就点击了某个控件。即Katalon Recorder是一大助力但也只是一大助力而不是万能钥匙。
参考: