弹出对话框、文件上传及页面截图的操作处理
目的: 了解原生对话框的概念及类型,掌握Alert(警告信息)、confirm(确认信息)和prompt(提示输入)的操作方法;学习使用标准控件和非标准控件进行文件上传的操作命令;掌握截取浏览器屏幕内容保存为图片文件的方法。
要求: 在pycharm 环境下完成实验目的中所述各项任务
条件: win7/10、pycharm、selenium4.4.0
内容及步骤:
在web前端自动化测试过程种,经常会遇到对浏览器弹出的各种原生对话框的处理。
这种弹窗不是HTML的元素,它是属于浏览器自带的弹窗(是由JavaScript生成的),所以叫做原生对话框。因此,用F12选择元素的方法是选择不到的,也无法定位。
原生对话框有三种类型,分别是: Alert(警告信息)、confirm(确认信息)和prompt(提示输入)。
Selenium所提供的switch_to.alert方法可以定位到alert/confirm/prompt对话框。使用text/accept/dismiss/send_keys函数进行相关操作。
(练习网址:https://cdn2.byhy.net/files/selenium/test4.html)
在网页中对弹出对话框进行操作时,需要知道界面中是否有弹窗。expected_conditions类(需要先导入:from selenium.webdriver.support import expected_conditions as EC
)中包括判断页面上是否存在alert的函数: alert_is_present()
。针对原生对话框的操作,就可以在先判断网页中存在弹出对话框后再执行。
一、 操作Alert(警告信息):
Alert(警告信息)框中除了显示通知信息外,只含有一个OK按钮,当用户看完信息后,点击确定就可以了。如果我们不去点击,就不能操作页面中的其它元素。
-
模拟用户点击 OK 按钮:
driver.switch_to.alert.accept()
-
获取弹出对话框中的信息内容:
driver.switch_to.alert.text
二、 操作confirm(确认信息):
confirm(确认信息)框用来向用户提示一个“是与否”问题,含有一个OK和一个Cancel按钮,主要是让用户确认是否要进行某个操作。
-
模拟用户点击 OK 按钮:
driver.switch_to.alert.accept()
-
模拟用户点击 Cancel 按钮:
driver.switch_to.alert.dismiss()
三、 操作prompt(提示输入):
prompt(提示输入)框提供一个文本字段,用户可以在此字段输入一个答案来响应相关提示。含有一个OK和一个Cancel按钮。选择“确认”会响应对应的提示信息,选择“取消”会关闭对话框。由于prompt框中是要输入内容的,所以对prompt可以使用send_keys函数。
- 模拟用户输入一些信息,提交上去:
driver.switch_to.alert.send_keys(上传文本)
四、 文件上传操作:
文件上传是web页面上很常见的一个功能。要对这一功能进行测试,一般情况下,需要将准备好的文件放在预定的路径下,然后在Selenium自动化测试的脚本中,编写去预置的路径下获取文件的代码即可。
- 标准控件(input)上传:
被测产品的UI界面中存在可输入文件路径的input输入框(该input框元素可能是可见元素,也有可能是隐藏元素,它的type 属性通常为“file”),可以通过send_keys('文件路径')
函数进行上传。
例如:访问 http://www.sahitest.com/demo/php/fileUpload.htm 网页,定位到第一个可输入文件路径的input输入框,调用send_keys()方法传入要上传的文件路径。
# 打开学习网站
wd.get('http://www.sahitest.com/demo/php/fileUpload.htm')
# 定位input元素,使用send_keys() 方法传入要上传的文件路径
wd.find_element(By.CSS_SELECTOR, '#file').send_key('D:\\file\\f1.txt')
# 点击提交按钮,上传文件
wd.find_element(By.CSS_SELECTOR, 'form[name="form1"] input[value="Submit Single"]').click()
需要上传多个文件,可以多次调用send_keys方法。
- 非标准控件(非input型)上传:
如果被测系统界面中不存在可输入文件路径的input输入框,就要借用第三方手段来辅助完成上传文件的操作,这里我们介绍使用 win32gui完成文件的上传。
首先需要安装pywin32库,我们要在pycharm terminal 中输入安装语句:pip install pypiwin32
然后要在测试脚本中导入 import win32com.client
找到可通过点击上传的元素,执行点击,等待上传选择文件对话框打开。
在Windows环境中,运行的程序可以调用Wshshell(WScript.Shell)对象,对Windows的外壳程序进行访问,执行操作系统外壳常用的操作,比如运行程序、读写注册表、环境变量等。尤其,当这个Wshshell对象无法识别,又要在此对象内输入字符串时,可以调用Wshshell对象的SendKeys()方法,直接向当前的应用程序发送键盘消息。我们这里就是将完整的文件路径字符串发送输入到文件打开对话框的文件名文本框中,字符串末尾要加’\n’,表示回车确定(也可能是 ‘\r’ 或者 ‘\r\n’),实现非input型文件上传过程。
例如,访问 https://tinypng.com 网页,演示非标准控件文件上传方法。
import win32com.client
# 打开在线图片网站
wd.get('https://tinypng.com')
wd.maximize_window()
# 找到点击上传的元素,点击
wd.find_element(By.CSS_SELECTOR, '.target .icon').click()
# 等待上传选择文件对话框打开
sleep(2)
# 获取当前活跃的应用程序 shell对象
shell = win32com.client.Dispatch("wScript.Shell")
# shell对象可以执行操作系统外壳常用的操作,比如运行程序,读写注册表,扩展环境变量等
# 当一个对象无法识别,又要在此对象内输入字符串时,调用shell对象的SendKeys方法
# 输入文件路径,回车确定直接发送键盘消息给 当前应用程序,
# 有的系统需要加'\r',有的系统需要加'\r\n'
shell.Sendkeys(r'D:\file\f2.png'+'{ENTER}'+'\n')
sleep(2)
wd.quit()
练习1: 打开https://cdn2.byhy.net/files/selenium/test4.html网页,窗口最大化,分别点击alter按钮、confirm按钮及prompt按钮,检查是否存在对应的弹出对话框,不存在则打印“未弹出!”;存在则打印对话框提示信息文本,并分别点击alter对话框中“确定”按钮、confirm对话框中“取消”按钮,以及在prompt对话框的输入框内输入“python之selenium自动化测试”文本且点击“确定”按钮。针对confirm对话框和prompt对话框的操作进行检查(这两个操作执行后页面中有相应文本提示)。前面的每个操作后暂停3秒,方便观察。关闭浏览器。
from time import sleep
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support import expected_conditions as EC
path = Service()
driver = webdriver.Chrome()
driver.get("https://cdn2.byhy.net/files/selenium/test4.html")
driver.implicitly_wait(3)
driver.maximize_window()
driver.find_element(By.ID, 'b1').click()
if EC.alert_is_present():
print(driver.switch_to.alert.text)
sleep(3)
driver.switch_to.alert.accept()
else:
print('未弹出!')
driver.find_element(By.ID, 'b2').click()
if EC.alert_is_present():
print(driver.switch_to.alert.text)
sleep(3)
driver.switch_to.alert.dismiss()
else:
print('未弹出!')
if driver.find_element(By.CSS_SELECTOR,'#add>li').text=="取消操作":
print('confirm框测试通过!')
else:
print('confirm框测试失败!')
driver.find_element(By.ID,'b3').click()
if EC.alert_is_present():
print(driver.switch_to.alert.text)
sleep(3)
driver.switch_to.alert.send_keys("python之selenium自动化测试")
sleep(3)
driver.switch_to.alert.accept()
sleep(3)
if driver.find_element(By.CSS_SELECTOR, '#add > li:nth-child(2)').text=="你想学习:python之selenium自动化测试":
print("prompt按钮已确认被点击")
else:
print('prompt测试失败')
练习2: 在浏览器中访问百度网站并将窗口最大化,进行实操练习。在百度搜索框中输入文本“Selenium”并搜索,点击“设置”菜单,打开“搜索设置”界面,在搜索语言范围中:设置“仅简体中文”,在搜索结果显示条数中:设置搜索结果“每页50条”,点击保存设置。此时应该会弹出alter类对话框,打印对话框内容,点击对话框中“确定”按钮,否则打印输出“未弹出!”。检查搜索结果是否每页50条(注意:有的搜索结果中有1条为“大家还在搜”,需把剔除此条记录),正确输出“每页显示50条设置通过!”,否则输出“设置失败!”。重新打开“搜索设置”界面,点击“恢复默认”按钮,此时仍会弹出alter类对话框,打印对话框内容,点击对话框中“确定”按钮。检查搜索结果是否每页10条,按上述过程输出测试结果。关闭浏览器。
from time import sleep
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support import expected_conditions as EC
path = Service()
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.implicitly_wait(3)
driver.maximize_window()
#1
driver.find_element(By.CSS_SELECTOR,'.s_ipt').send_keys("Selenium")
driver.find_element(By.CSS_SELECTOR,'#su').click()
sleep(3)
for handle in driver.window_handles:
driver.switch_to.window(handle)
if "wd=Selenium" in driver.current_url:
break
# print(driver.title)
ac=ActionChains(driver)
e1=driver.find_element(By.CSS_SELECTOR,'.pf')
ac.move_to_element(e1).pause(3)
sleep(2)
ac.perform()
driver.find_element(By.CSS_SELECTOR,'.bdpfmenu .set:nth-child(1)').click()
sleep(3)
driver.find_element(By.CSS_SELECTOR,'#se-settting-2 span:nth-child(2) label').click()
driver.find_element(By.CSS_SELECTOR,'#se-setting-3 span:nth-child(3) label').click()
sleep(2)
driver.find_element(By.CSS_SELECTOR,'.bottom-btn-wrap .prefpanelgo').click()
sleep(1)
is_exist = EC.alert_is_present()(driver)
if is_exist!=False:
print(driver.switch_to.alert.text)
driver.switch_to.alert.accept()
else:
print("未弹出")
searcher_record=driver.find_elements(By.CSS_SELECTOR,'.c-container h3')
if len(searcher_record)==50:
print("每页显示50条数据设置通过")
else:
print("设置失败")
e1=driver.find_element(By.CSS_SELECTOR,'.pf')
ac.move_to_element(e1).pause(3)
sleep(2)
ac.perform()
driver.find_element(By.CSS_SELECTOR,'.bdpfmenu .set:nth-child(1)').click()
sleep(2)
driver.find_element(By.CSS_SELECTOR,'.prefpanelrestore').click()
sleep(1)
if is_exist!=False:
print(driver.switch_to.alert.text)
driver.switch_to.alert.accept()
else:
print("未弹出")
searcher_record2=driver.find_elements(By.CSS_SELECTOR,'.c-container h3')
if len(searcher_record2)==10:
print("每页显示10条数据设置通过")
else:
print("恢复默认设置失败")
练习3:自己准备好两个png图片文件,仿照例题在https://tinypng.com网站中完成两种方式的文件上传。先定位到该网页中可输入文件路径的input输入框,上传文件1,完成后截屏保存为sp1.png。再利用pywin32库实现图片2的上传,完成后截屏保存为sp2.png。适当调整文件上传后的等待时间,使截屏图片能够反映成功上传后的完整信息。关闭浏览器。
from time import sleep
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.common.actions.action_builder import ActionBuilder
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.select import Select
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import win32com.client
driver = webdriver.Chrome()
driver.get("https://tinypng.com/")
driver.implicitly_wait(3)
driver.maximize_window()
# 1
input1=driver.find_element(By.CSS_SELECTOR, '.target input[type="file"]')
input1.send_keys(r"D:\file\1.jpg")
sleep(3)
driver.get_screenshot_as_file(r"D:\file\sp1.png")
#2
driver.find_element(By.CSS_SELECTOR,'.target .icon').click()
sleep(2)
shell=win32com.client.Dispatch("WScript.Shell")
shell.SendKeys(r"D:\file\2.jpg"+'{ENTER}'+"\n")
sleep(3)
driver.get_screenshot_as_file(r"D:\file\sp2.png")
driver.quit()