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

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个问题自动开始一个新的页面。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

React 渲染流程分析

React 页面是由组件组成的,从根组件直到叶组件,内部的组件数通过 Fiber 来保存并触发并发更新。页面的展示分为两部分,首先是初始化,所有组件首次展示,都要进行渲染,之后是更新流程,也就是页面产…

团队知识管理首选:12款优秀开源Wiki系统推荐

文章介绍了12款好用的开源Wiki:PingCode、DokuWiki、MediaWiki、Tiki Wiki CMS Groupware、XWiki、BookStack、PMWiki、Foswiki、GitBook、Wiki.js、TiddlyWiki、Slite。以及对比了一款非开源但提供免费版本的Wiki工具,以供大家选择。 在企业知识管理和团…

Vue3+vite部署nginx的二级目录,使用hash模式

修改router访问路径 import { createRouter, createWebHashHistory } from vue-routerconst router createRouter({history: createWebHashHistory (/mall4pc-bbc/),routes: [XXX,] })配置package.json文件 "build:testTwo": "vite build --mode testing --ba…

python dropna怎么用

pandas的设计目标之一就是使得处理缺失数据的任务更加轻松些。pandas使用NaN作为缺失数据的标记。 使用dropna使得滤除缺失数据更加得心应手。 dropna常用参数: # DataFrame.dropna(axis0, howany, threshNone, subsetNone, inplaceFalse) 主要的2个参数&#xff…

运筹学基础与应用(简洁版总复习)

第一章 线性规划及单纯形法 图解法 单纯形法 大m法 看案例(综合题) 化标准形式 目标函数的转换 min z变为max z 变量的变换 变量取值无约束 约束方程的转换 ≤:加一个松弛变量 ≥:减一个剩余变量 变量符号≤0的变换 保持变量≥…

618家用智能投影仪推荐:这个高性价比品牌不容错过

随着科技的不断进步,家庭影院的概念已经从传统的大屏幕电视逐渐转向了更为灵活和便携的家用智能投影仪。随着618电商大促的到来,想要购买投影仪的用户们也开始摩拳擦掌了。本文将从投影仪的基础知识入手,为您推荐几款性价比很高的投影仪&…

绘唐一键追爆款2.5免费版

一键追爆款是指通过某种技术手段,可以快速找到当下市场上热销的商品,并进行追踪和购买的方法。这样做可以帮助商家快速抓住市场热点,提高销售业绩。 实现一键追爆款的方法有很多,例如利用大数据分析技术,通过对市场数据…

零售行业会员管理有哪些业务场景?解析不同业务场景的分析指标

在当今竞争激烈的零售市场中,会员管理不再仅仅是收集和存储数据,而是要求企业能够从数据中获取洞察,并据此制定策略。会员板块的业务场景涵盖了多个方面,每一个场景都为企业提供了一个独特的视角,帮助企业了解和服务于…

MSPM0L1306时钟树

图显示了MSPM0Lxx系列设备的顶级时钟树。此图显示映射 振荡器(源)和时钟(目的地)之间,以及的SYSCTL寄存器位字段 选择多路复用器。请注意,并非所有设备都具有图所示的所有时钟系统功能。

【开源】课程智能组卷系统 SSM+JSP+MySQL

目录 一、项目介绍 学生模块 老师模块 试卷模块 试题模块 考试模块 二、项目界面 三、核心代码 一、项目介绍 经典老框架SSM打造入门项目《课程智能组卷系统》,可以给管理员们、学生、教师使用,包括学生模块、老师模块、试卷模块、试题模块、考试模块、公告…

查分易分班查询系统怎么做?

分班查询一直是让许多老师头疼的问题。一到开学季,办公桌上就堆满了学生的资料和分班表。要将这些信息一一录入系统,然后发布给学生和家长极其浪费时间和精力,而且很容易出错。每当分班结果公布时,家长和学生急切地想要知道自己的…

SAS:PROC SQL和ANSI标准

文章来源于SAS HELP PROC SQL 和ANSI SQL 的区别——图表和视图名称的作用域规则不同 例1:匹配数据集相关名称 当PROC SQL匹配数据集相关名称时,会依次进行3个步骤:1、有别名,用别名匹配;2、1匹配失败,在无…

tmux-以脚本中的tmux命令为例解释常用tmux命令

SESSIONenv_monitor_hr_parking ----- 将会话名称env_monitor_hr_parking赋值给变量SESSION tmux new-session -s $SESSION -n runner -d ----- new-session 用于创建新的会话。-s $SESSION 是一个选项,其中 $SESSION 是你想要给你的新会话命名的名称。-n runner 是…

基于YOLOv8的行人检测项目的实现

YOLOv8简介 YOLOv8是YOLO系列的最新版本,在继承YOLOv7的基础上进行了进一步改进。YOLOv8在网络结构、损失函数和训练策略上都有显著的提升,使其在目标检测任务中表现更加出色。各位只需要记住,做目标检测,无脑选V8就完了。YOLOv8…

Visual Studio和BOM历史渊源

今天看文档无意间碰到了微软对编码格式解释,如下链接: Understanding file encoding in VS Code and PowerShell - PowerShell | Microsoft LearnConfigure file encoding in VS Code and PowerShellhttps://learn.microsoft.com/en-us/powershell/scrip…

Golang——RPC

一. RPC简介 远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议。该协议运行于一台计算机的程序调用另外一台计算机的子程序,而程序员无需额外的为这个交互作用编程。如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远…

Sublime Text 4 - 前端代码编辑的卓越之选

Sublime Text 4 是一款备受赞誉的前端代码编辑神器,无论是在 Mac 系统还是 Windows 系统上,都展现出了其独特的魅力和强大的功能。 Sublime Text 4 拥有简洁而直观的用户界面,让开发者能够快速上手并沉浸于代码编写的过程中。它提供了高度可…

二叉树构建

由于二叉树的左右子树和整树相似(即子问题和原始问题相似),因此多考虑使用递归的方法解决问题。 leetcode 108.将有序列表转换为二叉树 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡…

Python数据分析个人笔记6

目录 Function application读取数据查看数据信息自定义函数拆分square自定义函数拆分years自定义函数拆分floor自定义函数拆分followInfo1、获取followInfo列2、对followInfo列进行拆分3、提取关注人数4、提取带看次数5、添加到house的最后两列 缺失值处理house.infohouse.drop…