【问题标题】:Python selenium code seems to wait after calling javascript that display modal dialog boxPython selenium 代码似乎在调用显示模式对话框的 javascript 后等待
【发布时间】:2025-12-17 16:15:02
【问题描述】:

我正在使用 Python 和 Selenium 在 Internet Explorer 中编写自动化脚本。

当网页弹出某种模式对话框时,Python 代码停止运行,只是等待对弹出窗口采取一些操作。按“是”或“否”按钮后,Python 代码将继续。

我相信被调用的底层 Javascript 函数 (saveClicked()) 正在使用这行代码生成弹出框: var result=window.showModalDialog('whatever....')

有谁知道如何在 Selenium 中处理这个问题?我希望我的代码在此窗口中单击“确定”或只是接受它。我尝试右键单击窗口查看源代码等,但这些选项没有提供给我……唯一的选项是“移动/关闭”。

我查看了 Selenium 中是否有某种默认的 IE 功能,它会自动接受所有模式对话框,但没有找到。我还考虑过用某种方式包装对 Javascript 函数的调用,以某种方式向警报发送击键。我对任何事情都持开放态度!

这是代码:它永远不会超过 .execute_script 行...它只是坐在那里等待。

print('Saving')

# I have to do this because I can't get the handle to the save button
# using any of the known Selenium methods but calling the JS works
driver.execute_script('saveClicked();')

print('Test')
driver.switch_to().alert().send_keys(Keys.ENTER)

代码在 Javascript 执行后停止,永远不会移动到 print('test') 行或我放在那里的任何其他代码。

任何解决此问题的 python selenium 代码建议将不胜感激。

【问题讨论】:

  • 请分享一个可重现的最小示例!

标签: python selenium automation modal-dialog popup


【解决方案1】:

一种方法:你可以尝试使用Alert来管理弹窗

Alert(driver).accept()

否则,您可以通过以下方式查看活动窗口或选项卡:

#get current window handle
p = driver.current_window_handle

#get windows
chwd = driver.window_handles

driver.switch_to.window(chwd[1])

参考: https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.alert

【讨论】:

  • 嗨,Jain - 我试过了,代码永远不会移动到下一行。我的代码如下所示: print('Saving...') driver.execute_script('saveClicked();') print('Test') driver.switch_to.alert()移动到下一行。对此有什么想法吗?
  • 这远不是最好的解决方案。
  • 任何警报方法都不起作用,因为它不是警报。这是一个模态弹出窗口。
【解决方案2】:

试试:

message = "saveClicked()"  # or any other of your messages 
driver.execute_script(f"alert(\"{message}\");")
driver.switch_to.alert.accept()

【讨论】:

  • 所以 'saveClicked()" 是一个 Javascript 函数,里面有很多代码,执行时最终会抛出这个模态警报/窗口。这段代码还能正常工作吗?跨度>
  • 在我的例子中,saveClicked() 不是一个函数,而只是一个字符串。在我看来,您的错误是使用 driver.switch_to().alert().accept() 而不是 driver.switch_to.alert.accept()。
  • 嗨 Vitaliis - 所以唯一的问题是,一旦 execute_script 行运行,程序永远不会前进到下一行(在这种情况下是 driver.switch_to.alert.accept()。它只是坐在那里等待按下模态窗口上的按钮。还有其他想法可以解决吗?
  • 如果是标准警报,我的代码必须关闭窗口。您的警报可能不是标准的浏览器警报,而是自定义模式对话框。
  • 是的,这不是警报。这是一个模态对话框。有什么办法可以关闭或者接受吗?