Python Selenium:执行脚本生成确认框后如何获取返回值?
Selenium中获取confirm弹窗的用户选择结果
为什么execute_script返回None
当你用execute_script('return confirm("xxx");')时,Selenium执行这段JS后,confirm()弹窗会阻塞JS执行,直到用户关闭弹窗。Selenium的execute_script会在弹窗存在期间处于等待状态,一旦用户关闭弹窗,JS执行完成,但此时Selenium无法捕获confirm()的返回值,因此固定返回None。
switch_to.alert是否影响返回值
不会。execute_script已经返回None之后,你才执行switch_to.alert,两者是先后独立的操作,后者不会改变前者的返回结果。
正确获取用户选择的方法
有两种可行方案:
方案1:通过JS全局变量存储结果
触发confirm时,将结果存入浏览器全局变量,之后读取该变量即可拿到用户选择:
# 触发confirm并把结果存入全局变量 self.driver.execute_script('window.userChoice = confirm("test press ok or cancel");') # 获取存储的结果 user_choice = self.driver.execute_script('return window.userChoice;') # user_choice会是True(点击确定)或False(点击取消)
方案2:主动处理弹窗并记录结果
如果需要代码自动处理弹窗(而非用户手动操作),可切换到弹窗后执行对应动作,同时自行记录结果:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 触发弹窗 self.driver.execute_script('confirm("test press ok or cancel");') # 等待弹窗出现 alert = WebDriverWait(self.driver, 10).until(EC.alert_is_present()) # 模拟点击确定并记录结果 user_choice = True alert.accept() # 若模拟点击取消则改为: # user_choice = False # alert.dismiss()
注意:如果是让用户手动点击弹窗,方案2不适用——用户关闭弹窗后,execute_script才会返回,此时弹窗已不存在,switch_to.alert会抛出NoAlertPresentException,这种情况下方案1是唯一可行的方式。
内容的提问来源于stack exchange,提问作者user10463779
相关产品推荐
相关产品推荐

