当前位置: 首页 > article >正文

【测开】利用界面化操作存储步骤数据,为 Selenium 自动化测试提效赋能(一)

开篇简介

本篇分享我设计的sqlite数据步骤表结构、以及让selenium4执行的方法;

不当之处请多多指教。

如下是qt界面,执行用例的时候,完成selenium的定位元素、鼠标事件等。

准备

1、selenium知识

selenium是可以模拟人工执行浏览器的库。

selenium4的helloworld.py,python的selenium4库已经不需要单独安装本地驱动了。

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service

# 使用 WebDriverManager 获取 ChromeDriver 的路径
driver_path = ChromeDriverManager().install()
# 使用 Service 类来传递 ChromeDriver 路径
service = Service(driver_path)


driver = webdriver.Chrome(service=service)
# 步骤1: 打开一个网页
driver.get('https://www.baidu.com/')
# 步骤2: 输入搜索词并点击搜索按钮
search_box = driver.find_element('id', 'kw')
search_box.send_keys('自动化测试')
# 步骤3: 点击提交
search_button = driver.find_element('id', 'su')
search_button.click()


# 等待几秒钟以便查看效果(可选)
import time
time.sleep(5)

# 关闭浏览器
driver.quit()

 selenium有很多操作、可以参考selenium整理。

2. pyqt5以及QThread多线程

如下是简单的pyqt5中多线程QThread启用、以及pyqtSignal的使用

  • QThred的子类中,run方法,使用子类对象调用start()方法,就可以创建一个多线程来执行run犯法。
  • 定义一个信号,在对应的地方发射信号,最后append到文本框

 

import sys, time
from PyQt5.QtWidgets import QApplication, QMainWindow, QTextEdit, QVBoxLayout, QWidget,QPushButton
from PyQt5.QtCore import pyqtSignal, QObject, QThread

class SeleniumSignal(QObject):
    # 定义一个信号,用于传递字符串信息
    message = pyqtSignal(str)

class SeleniumExecutor(QThread):
    def __init__(self, signal):
        super().__init__()
        self.steps = None
        self.signal = signal
        self.excutor_person = 1

    def run(self):
        if self.steps:  # 确保有步骤需要执行
            self.excute()

    def excute(self):
        self.signal.message.emit(f"{self.excutor_person}开始执行....")
        for step in self.steps:
            action_name = step['action_name']
            self.signal.message.emit(f"{self.excutor_person}正在执行步骤: {action_name}")
            time.sleep(1)  # 模拟每个步骤之间的延迟
            # 这里可以加入实际的步骤执行逻辑
            self.signal.message.emit(f"{self.excutor_person}步骤 {action_name} 执行完成")
            time.sleep(1)  # 模拟每个步骤之间的延迟
        self.signal.message.emit(f"{self.excutor_person}所有步骤执行完成")
        self.excutor_person = 1 + self.excutor_person


    def set_steps(self,steps):
        self.steps = steps



class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Selenium Executor')
        self.resize(800,600)

        btn = QPushButton("执行")
        btn.clicked.connect(self.run_selenium)

        self.text_edit = QTextEdit(self)
        self.text_edit.setReadOnly(True)
        layout = QVBoxLayout()
        layout.addWidget(btn)
        layout.addWidget(self.text_edit)
        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

        # 创建信号对象
        self.signal = SeleniumSignal()
        self.signal.message.connect(self.update_text)
        self.signal.message.connect(lambda xx:print(xx))


        # 提前实例化SeleniumExecutor对象
        self.executor = SeleniumExecutor( self.signal)
        # # 初始化,多线程创建dirver
        self.executor.start()



    def update_text(self, message):
        self.text_edit.append(message)

    def run_selenium(self):
        # 1. 打开百度-搜索-点击
        steps = [{'id': 7, 'case_id': 2, 'step_number': 1, 'step_description': None, 'action_type_major': 'browser_operation', 'action_type_minor': 'open_windows', 'action_name': '打开窗口', 'value': 'https://www.baidu.com/', 'locator_type': None, 'locator_value': None, 'show_wait_time': None, 'iswait_find': 1, 'keyword_value': None, 'locator_type2': None, 'locator_value2': None},
                 {'id': 9, 'case_id': 2, 'step_number': 3, 'step_description': None, 'action_type_major': 'keyboard_operation', 'action_type_minor': 'text_input', 'action_name': '内容输入', 'value': 'ui自动化测试', 'locator_type': '0', 'locator_value': 'kw', 'show_wait_time': None, 'iswait_find': 1, 'keyword_value': None, 'locator_type2': None, 'locator_value2': None},
                 {'id': 10, 'case_id': 2, 'step_number': 4, 'step_description': None, 'action_type_major': 'mouse_operation', 'action_type_minor': 'mouse_click', 'action_name': '左键点击', 'value': None, 'locator_type': '0', 'locator_value': 'su', 'show_wait_time': None, 'iswait_find': 1, 'keyword_value': None, 'locator_type2': None, 'locator_value2': None},
                 {'id': 8, 'case_id': 2, 'step_number': 6, 'step_description': None, 'action_type_major': 'wait_operation', 'action_type_minor': 'force_wait', 'action_name': &

http://www.kler.cn/a/515529.html

相关文章:

  • C语言操作符(上)
  • 【算法】字符串之227.基本计算器 -- 双栈的变形
  • 缓存之美:万文详解 Caffeine 实现原理(下)
  • STM32更新程序OTA
  • Jenkins-pipeline语法说明
  • 第二十四课 Vue中子组件调用父组件数据
  • ubuntu k8s 1.31
  • 学习ASP.NET Core的身份认证(基于JwtBearer的身份认证9)
  • WPF5-x名称空间
  • 数据结构基础之《(16)—链表题目》
  • Spring中BeanFactory和ApplicationContext的区别
  • [Qt]系统相关-网络编程-TCP、UDP、HTTP协议
  • idea新增java快捷键代码片段
  • 基于 Python 的深度学习的车俩特征分析系统,附源码
  • 基于springboot的考研资讯平台
  • Windows的docker中安装gitlab
  • 随机变量的变量替换——归一化流和直方图规定化的数学基础
  • GCPAAS/DashBoard:完全免费的仪表盘设计,基于Vue+ElementUI+G2Plot+Echarts,开源代码,简单易用!还在等什么呢
  • 基于RAG构建Text2SQL的实战教程
  • IP属地与定位技术:谁更精准地锁定你的位置?
  • 理解 Rust 的所有权:内存管理的独特之道
  • ubuntu20.04有亮度调节条但是调节时亮度不变
  • IJK播放器问题集
  • 【LeetCode】--- MySQL刷题集合
  • [Computer Vision]实验二:图像特征点提取
  • stm32单片机个人学习笔记14(USART串口数据包)