Selenium与Qt应用:自动化与GUI结合实践
前言
在自动化测试中,Selenium 是一个强大的工具,能够模拟真实的浏览器操作。然而,当我们需要通过图形用户界面(GUI)进一步提高操作效率时,如何将自动化流程与用户友好的操作界面结合起来便成为了一个关键问题。本文将介绍如何使用 Selenium 与 PyQt5 相结合,实现一个带有 GUI 控制的自动化任务工具。
概述
本程序包含两个核心部分:一部分是基于 Selenium 的网页自动化任务,另一部分则是基于 PyQt5 的配置页面,用于通过界面输入和管理自动化操作的参数。
需要注意的是:各种依赖库和Python版本以及运行系统兼容性很重要。各位记的选择适配的版本。
具体功能如下:
1. 用户登录自动化:通过 Selenium 自动登录目标网页。
2. 数据抓取与导出:根据用户输入的时间范围,自动抓取网页中的数据并导出。
3. 配置文件管理:通过 PyQt5 界面管理自动化任务所需的配置,如账号、密码、时间范围等。
Selenium 部分实现
1. 浏览器初始化与登录
-
from selenium import webdriver
-
from selenium.webdriver.common.action_chains import ActionChains
-
from selenium.webdriver.support.ui import WebDriverWait
-
from selenium.webdriver.support import expected_conditions as EC
-
from selenium.webdriver.common.by import By
-
def login(driver, username, password):
-
driver.get(\'https://example.com/login\')
-
user_input = driver.find_element(By.NAME, \'username\')
-
pass_input = driver.find_element(By.NAME, \'password\')
-
login_button = driver.find_element(By.XPATH, \'//*[@id=\"login-button\"]\')
-
user_input.send_keys(username)
-
pass_input.send_keys(password)
-
login_button.click()
首先启动浏览器,并通过用户输入的账号密码登录目标系统。
2. 数据抓取
-
def search_user(driver, user_data):
-
search_input = WebDriverWait(driver, 10).until(
-
EC.visibility_of_element_located((By.XPATH, \'//*[@id=\"search-input\"]\'))
-
)
-
search_input.send_keys(user_data[\'户号\'])
-
search_button = driver.find_element(By.XPATH, \'//*[@id=\"search-button\"]\')
-
search_button.click()
模拟用户在网页上搜索指定信息,通过 Selenium 的 WebDriverWait 方法确保在元素加载完成后再进行操作,避免因页面加载过慢导致的异常。
3. 数据获取与处理
-
def get_aim_data(driver):
-
data_list = []
-
try:
-
table_element = WebDriverWait(driver, 10).until(
-
EC.visibility_of_element_located((By.XPATH, \'//*[@id=\"data-table\"]/tbody/tr\'))
-
)
-
rows = table_element.find_elements(By.TAG_NAME, \'tr\')
-
for row in rows:
-
columns = row.find_elements(By.TAG_NAME, \'td\')
-
data_list.append([col.text for col in columns])
-
except Exception as e:
-
print(f\"数据抓取失败: {e}\")
-
return data_list
通过 get_aim_data 函数抓取表格中的目标数据,逐行解析并存储到 data_list 中。
PyQt5 界面开发
为了增强程序的交互性,通过 PyQt5 实现了一个简单的 GUI 界面,用户可以通过该界面配置 Selenium 自动化任务的参数。
1. 界面初始化
-
from PyQt5.QtWidgets import QWidget, QFormLayout, QLineEdit, QPushButton, QLabel, QVBoxLayout
-
class ConfigPage(QWidget):
-
def __init__(self):
-
super().__init__()
-
self.init_ui()
-
def init_ui(self):
-
layout = QFormLayout()
-
self.username = QLineEdit(self)
-
self.password = QLineEdit(self)
-
self.start_date = QLineEdit(self)
-
self.end_date = QLineEdit(self)
-
layout.addRow(\"账号:\", self.username)
-
layout.addRow(\"密码:\", self.password)
-
layout.addRow(\"开始日期:\", self.start_date)
-
layout.addRow(\"结束日期:\", self.end_date)
-
submit_button = QPushButton(\"提交\", self)
-
submit_button.clicked.connect(self.submit_config)
-
main_layout = QVBoxLayout()
-
main_layout.addLayout(layout)
-
main_layout.addWidget(submit_button)
-
self.setLayout(main_layout)
-
def submit_config(self):
-
username = self.username.text()
-
password = self.password.text()
-
start_date = self.start_date.text()
-
end_date = self.end_date.text()
-
print(f\"账号: {username}, 密码: {password}, 开始日期: {start_date}, 结束日期: {end_date}\")
用户可以输入账号、密码以及数据抓取的时间范围,并点击“提交”按钮来保存这些配置。
2. 将配置应用于 Selenium 自动化
-
def selenium_job(username, password, start_date, end_date):
-
driver = webdriver.Chrome()
-
login(driver, username, password)
-
-
for date in iterate_dates(start_date, end_date):
-
search_user(driver, user_data)
-
data = get_aim_data(driver)
-
print(f\"{date} 的数据为: {data}\")
selenium_job 函数结合了前面的 Selenium 自动化操作,将从 GUI 中获取的配置应用于自动化任务中。
加入随机等待
为了避免网页封禁,我们可以在操作中加入了随机延迟时间。通过 time.sleep 和 random.uniform,可以在模拟用户操作时添加一定的不确定性。
-
import time, random
-
def sleep_time():
-
time.sleep(random.uniform(0.1, 0.5))
-
def sleep_time_short():
-
time.sleep(random.uniform(0.05, 0.2))
结语
上述错略的介绍了如何将 Selenium 与 PyQt5 结合,开发一个带有自动化功能和用户界面的工具。在实际使用中,这样的工具可以帮助我们高效地完成复杂的数据抓取任务,并通过图形界面简化配置。感觉有帮助的jym请点个赞。
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取