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')
<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>
<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>
弹窗有自己的方法:switch_to_alert()
首先,我之前的回复把问题想简单了,和你道歉
重新思考了下这个问题的场景,提供两个解题思路:
在完成第七行代码(点击操作)后,使用鼠标输入回车,尝试通过这种方式完成新弹出窗口的确认操作
这种解决方案可能存在的问题:解决核心:鼠标操作:ActionChains
输入回车的时间太快,新弹窗还没加载出来,解决方法:添加固定等待
页面加载后,alert弹窗没有定位到确认按钮下,点击回车无效。解决方法:需要你尝试下如何在只使用键盘操作的情况下,对alert弹窗进行确认。如果找不到,这种方案就可以舍弃了。
第七行的xpath获取的是一个input类型,推测这个选项是在一个新的页面选择后,回写到你所操作的元素中。
针对这种内容,可以直接在input中输入你希望选中的内容。
但是会有一个问题:这种控件可能控制无法输入,那你就需要使用js将元素的不可编辑熟悉修改为可编辑,然后再输入。
js的内容,参见我这个博客了的介绍:
希望这两种方式能够有一种解决你的问题
补充:第二个页面在onload的时候弹窗口,如果不确认,后续的html代码是不是就不会执行,所以开发者工具在第二个页面找不到任何信息。有其它方法不用切换窗口去确认这个alert吗?
第二次补充:如果第二个页面检测到切换到第一个页面时就自动关闭本身,则该问题还是没有得到解决。假设本问题第二个页面不能离开,即最原始的状态,如何去确认它加载时弹出的alert呢?为什么selenium代码通过第一个窗口的按钮点击打开第二个窗口,虽然第二个窗口页面已经呈现在眼前,但查看current_window_handle还是第一个窗口的handle呢?并不是第二个窗口的handle,此时因为有alert的存在,用switch_to.window方法无法切换成功,无法切到第二个窗口的handle则无法确认这个alert,这就奇怪了。