You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium调用driver.switch_to.alert未检测到弹窗,求排查方案

资产扫描流程中无法定位并接受弹窗问题

执行资产扫描更新流程时,尝试通过alert = driver.switch_to.alert定位并接受弹窗,但系统始终提示"No Alert",无法推进流程。

相关代码

def scan_thread(usr_obj, code, scan_mode, success_func, fail_func, *args):
    global driver
    print("scan_thread")

    if not driver:
        init_driver(usr_obj)

    driver.switch_to.default_content()

    if code.strip():
        os.system("cls")
        print(code.strip(), "was scanned")

        # 用正则表达式检查条形码是否合法
        if not re.match(r'^(\d\d|AG|CF)\d\d\d\d\d\d(\d\d)?$', code.upper()):
            log_csv(usr_obj, code, scan_mode, False)
            return fail_func(f"'{code}' is not a valid format")

        url = f"https://johndeere.service-now.com/alm_asset_list.do?sysparm_first_row=1&sysparm_query=GOTO123TEXTQUERY321%3d{code}&sysparm_query_encoded=GOTO123TEXTQUERY321%3d12345&sysparm_view="

        driver.get(url)

        # 扫描条形码后跳转至URL,切换到iframe并获取站点属性
        try:
            alert = driver.switch_to.alert
            alert.accept()
            print("alert accepted")
        except:
            print("no alert")

        wait = WebDriverWait(driver, 30).until(EC.frame_to_be_available_and_switch_to_it('gsft_main'))

调试日志

[DEBUG  ] [http          ]//localhost:9515 "POST /session/10c51be2819e01a97a7d306b88fe4cfb/url HTTP/1.1" 200 0
[DEBUG  ] [Remote response] status=200 | data={"value":null} | headers=HTTPHeaderDict({'Content-Length': '14', 'Content-Type': 'application/json; charset=utf-8', 'cache-control': 'no-cache'})
[DEBUG  ] Finished Request
[DEBUG  ] GET http://localhost:9515/session/10c51be2819e01a97a7d306b88fe4cfb/alert/text {}
no alert

可能的原因及解决办法

1. 弹窗并非浏览器原生Alert

如果页面弹窗是自定义模态框(用HTML/CSS/JS实现,不是浏览器自带的alert/confirm/prompt),driver.switch_to.alert无法识别。

  • 解决:用常规元素定位方法找弹窗的确认按钮,示例:
    driver.find_element(By.XPATH, "//button[text()='确认']").click()
    

2. 弹窗出现时机晚于代码执行

调用driver.get(url)后页面未完全加载,弹窗还未出现时代码就已执行检查逻辑。

  • 解决:添加等待逻辑,专门等待alert出现:
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    try:
        alert = WebDriverWait(driver, 10).until(EC.alert_is_present())
        alert.accept()
        print("alert accepted")
    except:
        print("no alert or timeout")
    

3. 页面跳转后上下文未同步

driver.get(url)跳转到新页面后,页面可能未完全加载,或之前的default_content切换影响了上下文。

  • 解决:先等待页面核心元素/标题加载完成,再检查alert:
    driver.get(url)
    # 等待页面标题加载,需根据实际页面修改
    WebDriverWait(driver, 20).until(EC.title_contains("资产列表"))
    # 再检查alert
    try:
        alert = driver.switch_to.alert
        alert.accept()
    except:
        print("no alert")
    

4. 浏览器驱动版本不兼容

浏览器与对应driver版本不匹配,可能导致alert识别异常。

  • 解决:更新浏览器驱动至与当前浏览器版本匹配的版本。

内容的提问来源于stack exchange,提问作者Dora Cacari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:46:13