selenium之 辨识alert、window以及操作

本文介绍了使用Selenium处理浏览器中的alert提示框、window窗口及div伪装的对话框的方法。主要内容包括如何区分alert、window及div对话框,针对alert的操作如确认、取消、输入文本等,针对window的操作如切换窗口,以及对div对话框的正常元素操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更多关于python selenium的文章,请关注我的专栏:Python Selenium自动化测试详解


很多人分辨不出什么是alert、什么是window,今天讨论下怎么辨识alert和window,以及页面元素如div伪装的对话框。

1.分辨

首先区别下alert、window和伪装对话框:

  • alert,浏览器弹出框,一般是用来确认某些操作、输入简单的text或用户名、密码等,根据浏览器的不同,弹出框的样式也不一样,不过都是很简单的一个小框。在firebug中是无法获取到该框的元素的,也就是说alert是不属于网页DOM树的。如下图所示:
    alert1
    alert2
    alert3

  • window,浏览器窗口,点击一个链接之后可能会打开一个新的浏览器窗口,跟之前的窗口是平行关系(alert跟窗口是父子关系,或者叫从属关系,alert必须依托于某一个窗口),有自己的地址栏、最大化、最小化按钮等。这个很容易分辨。

  • div伪装对话框,是通过网页元素伪装成对话框,这种对话框一般比较花哨,内容比较多,而且跟浏览器一看就不是一套,在网页中用firebug能够获取到其的元素,如下图:
    div伪装

2.alert操作

针对alert,selenium提供了相应的类来进行处理。

selenium.webdriver.common.alert.Alert(driver)

先列出Alert的所有操作:

Alert(driver).accept()  # 等同于点击“确认”或“OK”
Alert(driver).dismiss()  # 等同于点击“取消”或“Cancel”
Alert(driver).authenticate(username,password)  # 验证,针对需要身份验证的alert,目前还没有找到特别合适的示例页面
Alert(driver).send_keys(keysToSend)  # 发送文本,对有提交需求的prompt框(上图3)
Alert(driver).text  # 获取alert文本内容,对有信息显示的alert框

示例代码:

示例1:switch_to.alert , accept() , text

测试链接http://sahitest.com/demo/alertTest.htm

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://sahitest.com/demo/alertTest.htm')

driver.find_element_by_name('b1').click()

a1 = driver.switch_to.alert  # 通过switch_to.alert切换到alert
sleep(1)
print a1.text  # text属性输出alert的文本
a1.accept()  # alert“确认”
sleep(1)

driver.quit()

结果

Alert Message

示例2:Alert(driver) , dismiss()

测试链接http://sahitest.com/demo/confirmTest.htm

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.alert import Alert

driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://sahitest.com/demo/confirmTest.htm')

driver.find_element_by_name('b1').click()

a1 = Alert(driver)  # 直接实例化Alert对象
sleep(1)
print a1.text  # text属性输出alert的文本
a1.dismiss()  # alert“取消”
sleep(1)

driver.quit()

结果

Some question?

示例3:switch_to.alert , send_keys(keysToSend)

测试链接http://sahitest.com/demo/promptTest.htm

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://sahitest.com/demo/promptTest.htm')

driver.find_element_by_name('b1').click()

a1 = driver.switch_to.alert  # 通过switch_to.alert切换到alert
sleep(1)
print a1.text  # text属性输出alert的文本
a1.send_keys('send some words to alert!')  # 往prompt型alert中传入字符串
sleep(1)
a1.accept()
print driver.find_element_by_name('t1').get_attribute('value')
driver.quit()

结果

Some prompt?
send some words to alert!

authenticate(username,password)方法没有找到合适的示例网页,不在这里写示例代码,不过用法是和send_keys一样,不过是传入两个参数而已。并且这种框很少出现,便不做更多研究。

3.window操作

window类似于alert,不过与原window是平行的,所以只需要切换到新的window上便可以操作该window的元素。

driver.switch_to.window(window_handle)

而window是通过window句柄handle来定位的。而selenium提供了两个属性方法来查询window句柄:

driver.current_window_handle
driver.window_handles

用以上两个属性获取到当前窗口以及所有窗口的句柄,就可以切换到其他的window了。

示例代码:

测试链接http://sahitest.com/demo/index.htm

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.alert import Alert

driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://sahitest.com/demo/index.htm')

current_window = driver.current_window_handle  # 获取当前窗口handle name
driver.find_element_by_link_text('Window Open Test With Title').click()

all_windows = driver.window_handles  # 获取所有窗口handle name
# 切换window,如果window不是当前window,则切换到该window
for window in all_windows:
    if window != current_window:
        driver.switch_to.window(window)

print driver.title  # 打印该页面title

driver.close()
driver.switch_to.window(current_window)  # 关闭新窗口后切回原窗口,在这里不切回原窗口,是无法操作原窗口元素的,即使你关闭了新窗口
print driver.title  # 打印原页面title

driver.quit()

结果:

With Title
Sahi Tests

这里有一些注意事项:

  1. 只能通过window的name来切换窗口,但window的name不是你想象的窗口title之类的,而是一串字符串,如‘{976ae257-19be-4b32-a82e-4ba5063ed0a2}’,所以你用title、url之类的想切window是不可能的
  2. 关闭了新窗口之后,driver并不会自动跳转回原窗口,而是需要你switch回来,直接去定位窗口元素会报NoSuchElementException

3.div类对话框

div类对话框是普通的网页元素,通过正常的find_element就可以定位并进行操作。不在这里进行详述。注意设置一定的等待时间,以免还未加载出来便进行下一步操作,造成NoSuchElementException报错。

<think>好的,我现在需要帮用户解决关于Selenium中处理alert弹窗的操作方法的问题。用户之前问了关于文件上传功能的测试方法,现在转向了Selenium的弹窗处理,可能是在做自动化测试的相关工作。首先,用户提供的引用内容里,有三个关于Selenium处理alert弹窗的例子,分别涉及alert、confirm和prompt类型的弹窗。引用1和2给出了具体的代码示例,引用3是一个文章的结尾,可能没有太多实际内容,但可以忽略。用户现在想了解具体的操作方法,所以需要把这些引用中的信息整合起来,给出清晰的步骤和示例。 我需要先确定alert弹窗的类型,通常有三种:alert(只有确认按钮)、confirm(确认和取消)、prompt(可以输入文本)。用户提供的例子中,引用1处理的是alert,引用2处理的是prompt。需要分别说明这三种弹窗的处理方法,包括如何获取文本、接受、取消以及输入文本。 接下来,根据引用中的代码,可以看出处理弹窗的一般步骤是:定位元素并触发弹窗,然后使用switch_to.alert切换到弹窗,接着调用accept()、dismiss()或send_keys()等方法。需要将这些步骤结构化,分点说明,并给出对应的代码示例。 还需要注意代码的格式,用户之前的问题中示例代码用了Python,所以这里也需要用Python示例。同时,用户可能对弹窗处理的常见问题感兴趣,比如弹窗未出现时的异常处理,或者如何同时处理多个弹窗,这些可以作为相关问题提出。 另外,用户可能在实际使用中遇到弹窗处理失败的情况,比如弹窗没有及时弹出导致元素找不到,这时候可能需要加入等待机制,比如显式等待。这点在引用中没有提到,但作为补充内容会很有帮助,可以提升回答的完整性。 最后,生成相关问题时要考虑用户可能的后续需求,比如处理多个弹窗、异常处理、与框架结合使用等,这样能帮助用户进一步深入学习和解决问题。</think>### Seleniumalert弹窗操作方法详解 #### 一、基础弹窗类型及处理方法 1. **Alert(警告弹窗)** - 特点:仅包含确认按钮 - 核心方法: ```python alert = driver.switch_to.alert # 切换到弹窗对象 text = alert.text # 获取弹窗文本内容[^1] alert.accept() # 点击确认按钮 ``` ```python # 示例:处理警告弹窗 driver.get("http://sahitest.com/demo/alertTest.htm") driver.find_element_by_name("b1").click() alert = driver.switch_to.alert print(f"弹窗内容:{alert.text}") # 输出:Alert Message[^1] alert.accept() ``` 2. **Confirm(确认弹窗)** - 特点:包含确认和取消按钮 - 扩展方法: ```python alert.dismiss() # 点击取消按钮 ``` ```python # 示例:选择取消操作 alert = driver.switch_to.alert alert.dismiss() # 取消操作 ``` 3. **Prompt(输入弹窗)** - 特点:支持文本输入 - 特殊方法: ```python alert.send_keys("输入内容") # 向弹窗输入文本[^2] ``` ```python # 示例:处理带输入的弹窗 driver.get("http://sahitest.com/demo/promptTest.htm") driver.find_element_by_name("b1").click() alert = driver.switch_to.alert alert.send_keys("自动化测试") # 输入自定义内容[^2] alert.accept() ``` --- #### 二、进阶操作技巧 1. **异常处理机制** ```python from selenium.common.exceptions import NoAlertPresentException try: alert = driver.switch_to.alert alert.accept() except NoAlertPresentException: print("当前页面无弹窗") ``` 2. **显式等待弹窗** ```python from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC WebDriverWait(driver, 10).until(EC.alert_is_present()) alert = driver.switch_to.alert ``` 3. **多弹窗连续处理** ```python # 处理第一个弹窗 alert1 = driver.switch_to.alert alert1.accept() # 处理第二个弹窗 alert2 = driver.switch_to.alert alert2.dismiss() ``` --- #### 三、操作流程图解 ``` 触发弹窗 → switch_to.alert操作 → 返回页面 ↗ accept() ↘ dismiss() → send_keys() ``` ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值