软件测试 —— Selenium(弹窗)
软件测试 —— Selenium(弹窗)
- 弹窗的分类
- 1. JavaScript 弹窗
- 2. 模态对话框(Modal Dialogs)
- 3. 浏览器原生弹窗
- 4. 插件或扩展生成的弹窗
- Alert类型 switch_to.alert
- Confrim类型 accept()和dismiss()
- Prompt send_keys(),accpect(),dismiss()
- 文件上传 用send_keys传递路径
有时候,我们在访问浏览器时,浏览器会弹窗,如果我们想定位弹窗上的元素,一些弹窗用之前的方法是可以的,但是有一些弹窗不行,因为这部分弹窗不属于页面上的元素(可以看成新打开了一个页面,要切换句柄)。这个时候我们就要用一些其他的方法来进行交互:
在这之前,我们先了解一下弹窗的分类:
弹窗的分类
弹窗(Popup)在网页和应用程序中非常常见,它们用于向用户传达信息、请求确认或输入数据。根据其来源和技术实现方式,弹窗可以分为几种主要类型:
1. JavaScript 弹窗
这些弹窗是由 JavaScript 直接生成的,通常是最简单的形式,并且由浏览器直接管理。Selenium 可以通过内置的方法来处理这类弹窗。
- Alert:
- 显示一条消息给用户,并有一个“确定”按钮。
- 使用
driver.switch_to.alert
来访问并处理它。
- Confirm:
- 显示一条消息以及“确定”和“取消”两个按钮。
- 用户的选择可以通过
alert.accept()
或alert.dismiss()
来模拟。
- Prompt:
- 请求用户输入文本,并提供“确定”和“取消”选项。
- 可以使用
alert.send_keys()
输入文本,然后用alert.accept()
或alert.dismiss()
处理。
2. 模态对话框(Modal Dialogs)
模态对话框是一种阻止用户与页面其他部分交互直到对话框被关闭的弹窗。它们通常是由 HTML 和 CSS 构建,并可能包含表单或其他交互元素。由于它们是网页的一部分,所以 Selenium 可以像操作普通网页元素一样与之交互。
- Bootstrap Modal:
- 基于流行的 Bootstrap 框架创建的模态窗口。
- 使用标准的定位器(如 ID、类名、XPath 等)找到并操作这些元素。
- Custom Modals:
- 开发者自定义的模态对话框,样式和行为各异。
- 同样可以通过标准的 Selenium 定位技术进行交互。
3. 浏览器原生弹窗
这类弹窗不是由网页内容生成的,而是由浏览器本身或操作系统提供的。Selenium 无法直接与它们交互,因为它们不在 DOM 中。
- 文件上传/下载对话框:
- 当用户尝试上传或下载文件时出现的对话框。
- 可以通过设置浏览器配置项或者使用第三方工具(如 AutoIt, pywinauto)来自动化处理。
- 安全警告或证书错误提示:
- 浏览器遇到不信任的 SSL 证书或其他安全性问题时显示的警告。
- 这些通常需要手动处理,但有时也可以通过调整浏览器设置来绕过。
- 打印对话框:
- 当调用打印功能时出现的对话框。
- 类似地,这也不是网页的一部分,因此不能直接用 Selenium 控制。
4. 插件或扩展生成的弹窗
某些浏览器插件或扩展程序可能会生成自己的弹窗,例如广告拦截器的通知。对于这些弹窗,Selenium 也可能无能为力,因为它们不属于网页的内容。处理这种情况可能需要禁用相关插件或寻找特定的解决方案。
我们今天主要讨论的是Javascript那一类的弹窗,这一类的弹窗一般不能被定位。
Alert类型 switch_to.alert
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from webdriver_manager.firefox import GeckoDriverManager
FireFoxIns = GeckoDriverManager().install()
driver = webdriver.Firefox(service=Service(FireFoxIns))
# 弹窗
driver.get("file:///C:/Users/luoshui/Desktop/%E5%AD%A6%E4%B9%A0%E6%96%87%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/selenium-html/alert.html#")
# 点击
driver.find_element(By.CSS_SELECTOR,"#tooltip").click()
time.sleep(3)
# 点击弹窗(切换句柄)
alter =driver.switch_to.alert
time.sleep(3)
# 点击确定
alter.accept()
time.sleep(3)
Confrim类型 accept()和dismiss()
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from webdriver_manager.firefox import GeckoDriverManager
FireFoxIns = GeckoDriverManager().install()
driver = webdriver.Firefox(service=Service(FireFoxIns))
# 弹窗
#Alert
#driver.get("file:///C:/Users/luoshui/Desktop/%E5%AD%A6%E4%B9%A0%E6%96%87%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/selenium-html/alert.html#")
# Confrim
driver.get("file:///C:/Users/luoshui/Desktop/%E5%AD%A6%E4%B9%A0%E6%96%87%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/selenium-html/confirm.html")
# 点击
driver.find_element(By.CSS_SELECTOR,"body > input:nth-child(1)").click()
time.sleep(3)
# 点击弹窗(切换句柄)
alter =driver.switch_to.alert
time.sleep(3)
# 点击确定
alter.accept()
time.sleep(3)
driver.quit()
大家可以换成dismiss来试试看
Prompt send_keys(),accpect(),dismiss()
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from webdriver_manager.firefox import GeckoDriverManager
FireFoxIns = GeckoDriverManager().install()
driver = webdriver.Firefox(service=Service(FireFoxIns))
# 弹窗
#Alert
#driver.get("file:///C:/Users/luoshui/Desktop/%E5%AD%A6%E4%B9%A0%E6%96%87%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/selenium-html/alert.html#")
# Confrim
#driver.get("file:///C:/Users/luoshui/Desktop/%E5%AD%A6%E4%B9%A0%E6%96%87%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/selenium-html/confirm.html")
# Prompt
driver.get("file:///C:/Users/luoshui/Desktop/%E5%AD%A6%E4%B9%A0%E6%96%87%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/selenium-html/Prompt.html")
# 点击
driver.find_element(By.CSS_SELECTOR,"body > input:nth-child(1)").click()
time.sleep(3)
# 点击弹窗(切换句柄)
alter =driver.switch_to.alert
time.sleep(3)
#输入信息
alter.send_keys("admin")
time.sleep(3)
# 点击确定
alter.accept()
time.sleep(3)
driver.quit()
文件上传 用send_keys传递路径
点击文件上传的场景下会弹窗系统窗口,进行文件的选择。
selenium无法识别非web的控件,上传文件窗口为系统自带,无法识别窗口元素
但是可以使用sendkeys来上传指定路径的文件,达到的效果是一样的
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from webdriver_manager.firefox import GeckoDriverManager
FireFoxIns = GeckoDriverManager().install()
driver = webdriver.Firefox(service=Service(FireFoxIns))
# 弹窗
#Alert
#driver.get("file:///C:/Users/luoshui/Desktop/%E5%AD%A6%E4%B9%A0%E6%96%87%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/selenium-html/alert.html#")
# Confrim
#driver.get("file:///C:/Users/luoshui/Desktop/%E5%AD%A6%E4%B9%A0%E6%96%87%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/selenium-html/confirm.html")
# Prompt
#driver.get("file:///C:/Users/luoshui/Desktop/%E5%AD%A6%E4%B9%A0%E6%96%87%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/selenium-html/Prompt.html")
# 文件上传
driver.get("file:///C:/Users/luoshui/Desktop/%E5%AD%A6%E4%B9%A0%E6%96%87%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/selenium-html/upload.html")
# 点击
ele = driver.find_element(By.CSS_SELECTOR,".span6 > input:nth-child(2)")
time.sleep(3)
#输入信息
ele.send_keys("C:\\Users\\luoshui\\Desktop\\新建 文本文档.txt")
time.sleep(3)
driver.quit()