如何用Python Selenium点击三按钮消息框的Yes按钮?含Firefox适配问题
搞定Firefox中Selenium无法点击VB风格确认弹窗的问题
嘿,我来帮你解决这个头疼的弹窗问题!你原来的代码只能处理原生JS弹窗,但现在遇到的是用vbMsg生成的Yes/No确认框,而且在Firefox里搞不定对吧?结合你给的JS源码,我给你几个实用的解决方案:
先搞懂弹窗本质:不是原生alert,是模拟的!
从你贴的JS代码看,vbMsg这个函数是模拟VBScript的MsgBox行为——IE里原生支持VBS的MsgBox,但Firefox不买账,所以这个弹窗要么是前端用JS写的自定义模态框(比如用div做的假弹窗),要么是对原生confirm的封装。
方案一:直接跳过弹窗,让JS直接返回Yes
既然我们知道弹窗的逻辑是返回6就走Yes的流程,那不如直接用Selenium给页面注入JS,覆盖这个vbMsg函数,让它直接返回6,这样连弹窗都不会弹出来,直接执行后续提交逻辑:
# 在触发弹窗的操作之前,先注入这段JS driver.execute_script(""" function vbMsg(msg, title) { return 6; // 直接返回Yes对应的数值,跳过弹窗交互 } """) # 然后点击触发弹窗的按钮就行(比如你的提交按钮) # driver.find_element(By.ID, "你的提交按钮ID").click()
这个方法最省心,不用跟弹窗UI打交道,特别适合自动化测试场景。
方案二:如果是自定义DOM弹窗,直接点Yes按钮
要是vbMsg生成的是HTML做的自定义弹窗(比如一个带Yes按钮的div),那你就等弹窗加载出来,直接定位按钮点击就行:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 先点击触发弹窗的按钮 # driver.find_element(By.ID, "submit-btn").click() # 等待Yes按钮可点击,然后点击它 wait = WebDriverWait(driver, 10) yes_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()='Yes']"))) yes_btn.click()
这里要根据你实际弹窗的HTML结构调整定位方式,比如按钮的文本、class或者ID。
方案三:针对Firefox原生弹窗的修正
万一这个弹窗是原生的confirm(只是按钮显示成Yes/No),那你原来的switch_to_alert()已经被新版Selenium弃用了,得换成新的写法,还要确保geckodriver和Firefox版本匹配:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 触发弹窗后,等待弹窗出现 alert = WebDriverWait(driver, 10).until(EC.alert_is_present()) alert.accept() # 这个操作对应点击Yes按钮
记得检查geckodriver版本,版本不匹配的话Firefox经常会出各种奇怪的问题。
完整示例代码
结合你的JS逻辑,给你写个完整的执行流程:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 启动Firefox浏览器 driver = webdriver.Firefox() driver.get("你的页面URL") # 注入JS覆盖vbMsg函数,直接返回Yes对应的数值 driver.execute_script(""" function vbMsg(msg, title) { return 6; } """) # 找到触发preSubmit的按钮(比如submitpca按钮) submit_btn = driver.find_element(By.ID, "submitpca") submit_btn.click() # 等待页面跳转或者表单提交完成 WebDriverWait(driver, 15).until(EC.url_changes(driver.current_url)) # 关闭浏览器 driver.quit()
内容的提问来源于stack exchange,提问作者Ossama
相关产品推荐
相关产品推荐

