python selenium 新窗口有alert,采用switch_to.window无法切换到新窗口确认alert

selenium从一个窗口页面打开另一个窗口,新窗口会在页面加载的时候先弹框alert。想用switch_to.window切换到新窗口去确认alert,结果无法切换。
testalert.py
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('d:\\testalert\\testalert.html')
driver.find_element(By.XPATH, '/html/body/input[2]').click()  # 打开第二个页面

for window in driver.window_handles:  # 现有两个窗口
    print(window)

print('current window: ' + str(driver.current_window_handle))  # 仍指向第一个窗口
print('ready to switch to new window...')
driver.switch_to.window(driver.window_handles[1])  # failured 程序卡在这里,无法切换(手动确认alert后,可以继续执行)
print('current window: ' + str(driver.current_window_handle))
time.sleep(3)
driver.switch_to.alert.accept()
input('按任意键结束...')
print('accepted alert')

testalert.html
<html>
<head>
<script type="text/javascript">
  function display_alert_current_window()
  {
    alert("I am an alert box!!")
  }
  function display_alert_another_window()
  {
    window.open("testalert2.html")
  }
</script>
</head>

<body>
<input type="button" onclick="display_alert_current_window()" value="Display alert box in current window" />
<input type="button" onclick="display_alert_another_window()" value="Display alert box in another window" />
</body>
</html>

testalert2.html
<html>
<head>
<script type="text/javascript">
function display_alert()
  {
  alert("I am an alert box!!")
  }
</script>
</head>
<body onload="display_alert();">

<input type="button" onclick="display_alert()"
value="Display alert box" />

</body>
</html>

程序卡在driver.switch_to.window这里。
问题关键是无法切换到新窗口。
如何才能确认新窗口的弹框alert。


弹窗有自己的方法:switch_to_alert()

首先,我之前的回复把问题想简单了,和你道歉

重新思考了下这个问题的场景,提供两个解题思路:

  1. 在完成第七行代码(点击操作)后,使用鼠标输入回车,尝试通过这种方式完成新弹出窗口的确认操作
    这种解决方案可能存在的问题:解决核心:鼠标操作:ActionChains

  2. 输入回车的时间太快,新弹窗还没加载出来,解决方法:添加固定等待

  3. 页面加载后,alert弹窗没有定位到确认按钮下,点击回车无效。解决方法:需要你尝试下如何在只使用键盘操作的情况下,对alert弹窗进行确认。如果找不到,这种方案就可以舍弃了。

  4. 第七行的xpath获取的是一个input类型,推测这个选项是在一个新的页面选择后,回写到你所操作的元素中。
    针对这种内容,可以直接在input中输入你希望选中的内容。
    但是会有一个问题:这种控件可能控制无法输入,那你就需要使用js将元素的不可编辑熟悉修改为可编辑,然后再输入。
    js的内容,参见我这个博客了的介绍:

希望这两种方式能够有一种解决你的问题

补充:第二个页面在onload的时候弹窗口,如果不确认,后续的html代码是不是就不会执行,所以开发者工具在第二个页面找不到任何信息。有其它方法不用切换窗口去确认这个alert吗?

第二次补充:如果第二个页面检测到切换到第一个页面时就自动关闭本身,则该问题还是没有得到解决。假设本问题第二个页面不能离开,即最原始的状态,如何去确认它加载时弹出的alert呢?为什么selenium代码通过第一个窗口的按钮点击打开第二个窗口,虽然第二个窗口页面已经呈现在眼前,但查看current_window_handle还是第一个窗口的handle呢?并不是第二个窗口的handle,此时因为有alert的存在,用switch_to.window方法无法切换成功,无法切到第二个窗口的handle则无法确认这个alert,这就奇怪了。