Selenium+Python自动化78-AutoIt参数化与批量上传功能的实现
在使用Selenium进行自动化测试时,我们经常会遇到上传文件的场景。然而,使用Selenium自带的上传文件的方式,需要耗费大量的时间,因此我们可以使用AutoIt工具结合Selenium进行自动化测试来实现上传文件的功能。AutoIt是一种存在于Windows操作系统下的免费WARE开源软件。AutoIt可以被用于自动运行任务、提交表单等操作,它使用了一种小型的基于脚本的语言,和其他编程语言相比,学习曲线更加平缓,学习起来也比较容易。
实现步骤
- 下载AutoIt:从官网https://www.autoitscript.com/site/autoit/downloads/下载AutoIt安装包
- 安装AutoIt:下载完成后,解压到指定目录,即安装完成。
- 安装SciTE工具:SciTE是一个由AutoIt官方提供广泛支持的编辑器,可以用于自动化脚本的开发。下载把SciTE.exe放置于安装目录即可,例如:D:\AutoIt3\SciTE\SciTE.exe。
- 安装AutoItX3.dll:AutoItX3.dll是AutoIt的插件。在Python中,需要使用pywin32和win32com组件来调用AutoItX3.dll。
- 编写AutoIt脚本:编写AutoIt脚本,来实现文件上传的操作。例如,以下是上传图片的脚本:
$var = WinWaitActive("[CLASS:#32770]", "打开")
ControlSetText("[CLASS:#32770]", "", "[CLASS:Edit; INSTANCE:1]", "D:\image.png")
ControlClick("[CLASS:#32770]", "", "[CLASS:Button; INSTANCE:1]")
在上传文件时,我们只需要调用这段AutoIt脚本即可。这个脚本中的三个参数分别为窗口类、窗口名称和控件名称。
- 集成AutoIt和Selenium:在Python中,使用pywin32和win32com组件来调用AutoItX3.dll,来实现脚本的调度。具体操作可以参考以下代码示例:
import win32com.client
class AutoIt:
auto_it = None
wsh = None
def __init__(self):
# 初始化AutoIt
self.auto_it = win32com.client.Dispatch("AutoItX3.Control")
self.wsh = win32com.client.Dispatch("WScript.Shell")
def win_wait(self, window_title, timeout=60):
"""
等待窗口出现
"""
self.auto_it.WinWait(window_title, "", timeout)
def win_set_title(self, window_title, new_title):
"""
设置窗口标题
"""
self.auto_it.WinSetTitle(window_title, "", new_title)
def control_click(self, window_title, control, x=0, y=0, button="left", clicks=1):
"""
点击窗口控件
"""
self.win_wait(window_title)
self.auto_it.ControlClick(window_title, "", control, button, clicks, x, y)
def control_set_text(self, window_title, control, value):
"""
设置窗口控件的值
"""
self.win_wait(window_title)
self.auto_it.ControlSetText(window_title, "", control, value)
def send_keys(self, keys):
"""
发送按键
"""
self.wsh.SendKeys(keys)
示例
以下示例使用了AutoIt和Selenium结合的方式实现了批量上传文件的功能:
import os
import time
import win32api
import win32con
import win32com.client
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from autoit import AutoIt
# 模拟浏览器进行上传文件
def upload_file(driver, file_path):
# 控制浏览器滚动至上传控件元素
upload_element = driver.find_element_by_xpath('//div[@class="file-upload"]//input')
ActionChains(driver).move_to_element(upload_element).perform()
# 点击上传控件元素,调起系统文件选择对话框
upload_element.click()
# 使用AutoIt工具,操作系统文件选择对话框,选择目标文件并上传
auto_it = AutoIt()
auto_it.win_wait("打开", 5)
auto_it.control_set_text("打开", "[CLASS:Edit; INSTANCE:1]", file_path)
auto_it.control_click("打开", "[CLASS:Button; INSTANCE:1]")
wait = WebDriverWait(driver, 120)
wait.until(expected_conditions.invisibility_of_element_located((By.XPATH, '//div[@class="ant-spin-container"][ancestor::nz-upload]')))
time.sleep(1)
if __name__ == '__main__':
# 加载Firefox geckodriver,开启Firefox浏览器
driver_path = os.path.join(os.getcwd(), 'geckodriver.exe')
browser = webdriver.Firefox(executable_path=driver_path)
browser.implicitly_wait(10)
# 打开上传应用
browser.get("http://localhost:8080/upload")
browser.maximize_window()
# 确认上传页面已经打开
assert "Upload Files" in browser.title
# 点击上传文件按钮,上传文件
upload_file(browser, os.path.join(os.getcwd(), 'Upload_file.txt'))
upload_file(browser, os.path.join(os.getcwd(), 'Upload_file2.txt'))
# 关闭浏览器
browser.quit()
以上示例,在使用AutoIt脚本和Selenium结合的方式之后,实现了批量上传文件的功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:selenium+python自动化78-autoit参数化与批量上传功能的实现 - Python技术站