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

1.先看结构:

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

2.Base层。

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

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

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

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

base_page.py的内容如下:

import timefrom 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 = Trueedge_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 Truedef find_element(self, loc):try:return self.wait.until(EC.element_to_be_clickable(loc))except Exception as e:print(f"元素未找到:{loc}")return Falsedef find_elements(self, loc):elements = self.wait.until(EC.presence_of_all_elements_located(loc))if not elements:  # 可选:检查是否找到元素,如果没有,打印提示信息print(f"没有找到匹配的元素:{loc}")return elementsdef 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_pathdef 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_linedef 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_linedef 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 osclass 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):passcase = 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.mzph.cn/bicheng/26795.shtml

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

相关文章

App UI 风格展现非凡创意

App UI 风格展现非凡创意

首件检验为什么这么重要?

首件检验是制造业生产过程中的一个重要环节,通常是在每个班次刚开始时或生产过程中的条件发生改变后(如人员变动、材料更换、设备调整等),对加工的第一或前几件产品进行的专门检验。尤其在汽车零部件生产企业、电子制造企业广泛采…

光纤跳线(又称光纤连接器)的种类

光纤跳线(又称光纤连接器),也就是接入光模块的光纤接头,也有好多种,且相互之间不可以互用。SFP模块接LC光纤连接器,而GBIC接的是SC光纤连接器。下面对网络工程中几种常用的光纤连接器进行详细的说明&#x…

直播带货连创新高!TikTok美区下半年将迎来集中爆发!

美区直播带短短两周时间,TikTok货迎来大爆发! 5月31日,美国顶流美妆网红“Jeffree Star”,带货直播单场GMV创记录,销售额达到66.5万美元(约482.4万人民币)。紧接着,6月8日&#xff0…

docker拉取镜像失败超时的解决方法,docker配置国内镜像源

更换国内源 创建或修改 /etc/docker/daemon.json 文件 安装docker后一般只有 /etc/docker 这个目录 下面并没有 daemon.json 文件 我们直接创建 : vim /etc/docker/daemon.json {"registry-mirrors" : ["https://registry.docker-cn.com"…

怎么提高音频的播放速度?提高音频播放速度的四种方法

怎么提高音频的播放速度?提高音频的播放速度是在处理音频文件时经常需要面对的问题。音频播放速度的调整可以带来多种应用场景和效果,例如加快语音记录的回放速度以节省时间、提高听力理解和语速训练的效果等。然而,对于不同的音频播放工具和…

Eclipse创建Spring项目

第一步&#xff1a;先用Eclipse创建一个tomcat项目 打开eclipse 配置tomcat 这里点击add去添加tomcat 创建项目 写好项目名字&#xff0c;点击next 将这个Deploy path修改一下 配置一下项目&#xff0c;将项目部署到tomcat上面去 写个html测试一下 <html><h1>Hel…

云原生Kubernetes系列项目实战-k8s集群+高可用负载均衡层+防火墙

一、Kubernetes 区域可采用 Kubeadm 方式进行安装&#xff1a; 名称主机部署服务master192.168.91.10docker、kubeadm、kubelet、kubectl、flannelnode01192.168.91.11docker、kubeadm、kubelet、kubectl、flannelnode02192.168.91.20docker、kubeadm、kubelet、kubectl、flan…

python脚本实现arcgis离散型切片png格式十六进制名称转十进制名称

背景 Arcgis中离散型切片为png格式时,它的名称是十六进制格式的,而Arcgis不支持转为十进制格式的,所有需要自己写一个脚本来转换 效果 脚本 import osdef hex_to_dec(name):return str(int(name, 16))def

盘点|AI大模型时代,2024医疗器械网络安全应对与挑战(上)

6月5日&#xff0c;以“AI驱动安全”为主题&#xff0c;2024全球数字经济大会数字安全高层论坛&#xff0c;暨北京网络安全大会战略峰会在北京国家会议中心开幕。 与会专家指出&#xff0c;攻击者可利用人工智能技术生成网络攻击和网络钓鱼工具&#xff0c;网络安全从人人对抗、…

HarmonyOS(36) DevEco Studio 配置debug和release

在android开发中可以在build.gradle来配置realease和debug,在HarmonyOS中可以通过build-profile.json5文件中通过buildModeSet配置&#xff1a; 在DevEco Studio 中可以通过下面来选择运行debug还是release&#xff1a; 我们可以通过BuildProfile.ets里面的静态变量获取当前…

大模型推理优化

什么是大模型推理 **大模型推理其实就是大模型如何输出&#xff0c;怎么输出&#xff0c;输出什么的过程。**在人工智能的基础模型下&#xff0c;各种推理任务涵盖了多个领域&#xff0c;包括常识推理、数学推理、逻辑推理、因果推理、视觉推理、听觉推理、多模态推理和代理推…

计算机网络(5) ARP协议

什么是ARP 地址解析协议&#xff0c;即ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机&#xff0c;并接收返回消息&#xff0c;以此确定…

大模型的现状与未来:探索腾讯元宝APP及其他AIGC产品

前言 随着近日腾讯元宝APP的正式上线&#xff0c;国内大模型产品又添一员。近年来&#xff0c;随着人工智能技术的快速发展&#xff0c;AIGC&#xff08;AI生成内容&#xff09;产品逐渐成为技术与商业应用的热点。各大互联网厂商纷纷推出自己的大模型产品&#xff0c;以期在这…

原来斯坦福大学教程写的深度学习调参手册是真的有用啊

深度学习是机器学习其中的一个板块&#xff0c;要想深度神经网络在实践中正常运行&#xff0c;调参是必不可少的。 调参的“参”&#xff0c;指的是模型超参数&#xff0c;超参数可以决定某最优问题的求解速率以及模型学习效果等。超参设的好&#xff0c;能帮助快速找到问题的最…

使用QT绘制简单的动态数据折线图

两个核心类时QChart和QLineSeries 下面这个示例代码中&#xff0c;定时器每隔一段时间将曲线图中的数据点向右移动 一个单位&#xff0c;同时调整横坐标轴的范围&#xff0c;实现了一次滚动对应移动一个数据点的效果。 QLineSeries最多容纳40961024个点 #include <QtWidg…

ACL原理和基础配置

ACL&#xff08;Access Control List&#xff0c;访问控制列表&#xff09;是一种用于控制网络设备或操作系统上资源访问权限的方法。ACL能够基于规则和条件来允许或拒绝对资源的访问。 标准ACL&#xff08;Standard ACL&#xff09;&#xff1a;基于源IP地址来进行流量过滤&a…

计算机图形学入门11:图形管线与着色器

1.什么是图形管线 把场景中的物体经过一系列的处理&#xff0c;最后一张图像的形式在屏幕上显示出来&#xff0c;这一系列过程就是图形管线(Graphics Pipeline)&#xff0c;也叫实时渲染管线(Real-time Rendering Pipeline)。如下图所示&#xff0c;为整个渲染管线的过程。 渲染…

赛氪网受邀参加上海闵行区翻译协会年会,共探科技翻译创新之路

在科技飞速发展的时代背景下&#xff0c;翻译行业正面临着前所未有的机遇与挑战。作为连接高校、企业与社会的桥梁&#xff0c;赛氪网在推动翻译创新、促进学术交流方面展现出了独特的魅力。2024年6月9日&#xff0c;在华东师范大学外语学院举办的第十三届上海市闵行区翻译协会…

区别五大数据可视化工具,有这一篇就够了

进入企业数字化时代&#xff0c;数据可视化工具的重要性被越来越多企业看到。这些企业都希望在短时间内找到适合自己的数据可视化工具。以下是针对帆软BI、奥威BI、思迈特BI&#xff08;Smartbi&#xff09;、永洪BI和亿信华辰BI的详细介绍&#xff0c;希望能帮助用户企业快速筛…