基于selenium自动化索引点击

news2025/1/16 8:19:41

小鹅快速刷题,根据selenium和xpath定位题干,使用模糊匹配fuzzywuzzy库查找题目匹配答案,自动点击,完成后更新题库

  1. 先导入基本包,准备好题库
from fuzzywuzzy import process
from selenium import webdriver
import pandas as pd 
from selenium.webdriver.common.by import By
#%%
data = pd.read_csv('data.csv', header=None)
Q = data[0].tolist()
A = data[1].tolist()
#%%
# 启动浏览器
# driver = webdriver.Chrome()
driver = webdriver.Edge()
driver.get('答题链接')
  1. 获取答题的题目和选项路径
    在这里插入图片描述
def ans(q_i):
    _click  = False
    if q_i <51 or q_i > 70:
        _q = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div/div/div/div/section/section/div[{}]/section/div[1]/div[1]/div/div/div/div/div/p'.format(q_i)).text
        _q_class = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div/div/div/div/section/section/div[{}]/section/div[1]/div[2]'.format(q_i)).text
    else:
        _q = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div/div/div/div/section/section/div[{}]/div/div[1]/div[1]/div/div/div/div/div'.format(q_i)).text
        _q_class = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div/div/div/div/section/section/div[{}]/div/div[1]/div[2]'.format(q_i)).text
    _a = A[Q.index(_q)] if _q in Q else A[Q.index(process.extractOne(_q, Q)[0])]
    print(q_i, _a, _q, _q_class)
    print(process.extract(_q, Q))
    _q_a = []
    if '单选题' in _q_class:
        for e in driver.find_elements(By.XPATH, '/html/body/div[1]/div[2]/div/div/div/div/section/section/div[{}]/section/div[2]/div/label'.format(q_i)):
            _q_a.append(e.text)
            if e.text[0] in _a or _a in e.text:
                print('click'+e.text)
                _click = True
                e.click()
        print(_q_a)
    if '多选题' in _q_class:
        for e in driver.find_elements(By.XPATH, '/html/body/div[1]/div[2]/div/div/div/div/section/section/div[{}]/section/div[2]/label'.format(q_i)):
            _q_a.append(e.text)
            for _c in _a:
                if _c in e.text:
                    print('click'+e.text)
                    _click = True
                    e.click()
        print(_q_a)
    if '判断题' in _q_class:
        _ = driver.find_elements(By.XPATH, '/html/body/div[1]/div[2]/div/div/div/div/section/section/div[{}]/div/div[2]/div'.format(q_i))
        if '正确' in _a or '对' in _a or 'T' in _a:
            _[0].click()
            _click = True
            print("T")
        else:  
            _[1].click()    
            _click = True
            print("F")
    if '选择题' in _q_class:
        for e in driver.find_elements(By.XPATH, '/html/body/div[1]/div[2]/div/div/div/div/section/section/div[{}]/section/div[2]/label'.format(q_i)):
            _q_a.append(e.text)
            for _c in _a:
                if _c in e.text:
                    print('click'+e.text)
                    _click = True
                    e.click()
        print(_q_a)
    if not _click:
        print('no click', q_i)
        print('=====================================================')
        raise Exception('no click')
import time, random
for i in range(1, 73):
    try:
        ans(i)
        time.sleep(random.randint(1, 5))
    except Exception as e:
        print(e)
  1. 每次更新题库
def record(q_i):
    if q_i <51 or q_i > 70:
        _q = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div/div/div/div[1]/section/div/section[2]/div[{}]/section/div[1]/div[1]/div/div/div/div/div/p'.format(q_i)).text
        _q_class = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div/div/div/div[1]/section/div/section[2]/div[{}]/section/div[1]/div[2]'.format(q_i)).text
    else:
        _q = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div/div/div/div[1]/section/div/section[2]/div[{}]/div/div[1]/div[1]/div/div/div/div/div/p'.format(q_i)).text
        _q_class = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div/div/div/div[1]/section/div/section[2]/div[{}]/div/div[1]/div[2]'.format(q_i)).text
    _a = A[Q.index(_q)] if _q in Q else A[Q.index(process.extractOne(_q, Q)[0])]
    if '单选题' in _q_class:
        _ans = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div/div/div/div[1]/section/div/section[2]/div[{}]/section/div[3]/div/div[2]/div/div[1]/span'.format(q_i))
    if '多选题' in _q_class:
        _ans = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div/div/div/div[1]/section/div/section[2]/div[{}]/section/div[3]/div/div[2]/div/div[1]/span'.format(q_i))
    if '判断题' in _q_class:
        _ans = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div/div/div/div[1]/section/div/section[2]/div[{}]/div/div[3]/div/div[2]/div/div[1]/span'.format(q_i))
    if '选择题' in _q_class:
        _ans = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div/div/div/div[1]/section/div/section[2]/div[{}]/section/div[3]/div/div[2]/div/div[1]/span'.format(q_i))
    print(q_i, _q, _ans.text)
    print(_a)
    return _q, _ans.text

q = []
a = []
for i in range(1, 73):
    _q, _a = record(i)
    q.append(_q)
    a.append(_a)
pd.DataFrame({'q':q, 'a':a}).to_csv('data_record.csv', index=False, header=False)

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

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

相关文章

Android Split APK是什么

Android Split APK是一项应用程序分发和安装的技术&#xff0c;可以将大型应用程序拆分为多个较小的模块&#xff0c;以便用户可以选择性地下载和安装所需的模块&#xff0c;而无需一次性下载整个应用程序。这种技术旨在提高用户体验、减少下载时间和节省存储空间。 Android S…

什么是红黑树?用一组数据来介绍一下红黑树

上篇博客&#xff0c;我们使用代码完成了一个简单的红黑树功能&#xff0c;这篇&#xff0c;我补充一下&#xff0c;关于红黑树的相关知识点。 红黑树概述 红黑树是一种自平衡的二叉搜索树&#xff0c;它在每个节点上增加了一个存储位来表示节点的颜色&#xff0c;可以是红色…

信息安全与阿里云等保三级方案实践总结

信息安全在当今数字化时代变得至关重要&#xff0c;企业和组织需要采取有效措施来保护其数据和信息资产。阿里云作为中国领先的云服务提供商&#xff0c;提供了等保三级方案&#xff0c;帮助用户满足国家信息安全等级保护的要求。本文将探讨信息安全和阿里云等保三级方案的重要…

多媒体信息处理-重点知识-3. Feature Indexing and Retrieval

Chap 3. Feature Indexing and Retrieval 什么是索引&#xff1f; 为了提高数据集的检索效率而生成的结构化信息 基于特征的相似度匹配是多媒体数据检索方法的基础 从多媒体对象中提取重要特征&#xff0c;将其转化成高维特征向量存储在数据库中 相似性度量&#xff1a; 两种…

数据库|基于TiDB Binlog架构的主备集群切换操作手册

目录 一、具体操作过程 //1、停业务&#xff0c;待drainer追平主、备库数据 //2、使用sync-diff-inspector校验主从库数据是否一致 //3、关停主库到灾备库drainer同步链路后记录当前drainer同步TSO //4、使用dumpling/BR对灾备库进行数据全量备份&#xff08;备份期间可继…

leetcode——异或运算—— 只出现一次的数字

给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 示例 1 &#xff1a; 输入&#xff…

【Web安全靶场】sqli-labs-master 21-37 Advanced-Injection

sqli-labs-master 21-37 Advanced-Injection 第一关到第二十关请见专栏 文章目录 sqli-labs-master 21-37 Advanced-Injection第二十一关-Cookie注入第二十二关-Cookie注入第二十三关-注释符过滤的报错注入第二十四关-二次注入第二十五关-过滤OR、AND双写绕过第二十五a关-过滤…

关于 Runes 协议及「公开铭刻」发行机制的拓展讨论

撰文&#xff1a;MiX 编辑&#xff1a;Faust&#xff0c;极客 web3 2024 年 3 月 2 日&#xff0c;Runes 生态基础设施项目 Rune alpha 的创始人&#xff0c;在 Github 的公开议题中&#xff0c;与 Runes 协议创始人 Casey 展开了讨论&#xff0c;双方对如何拓展 Runes 协议的…

【QT】事件分发器/事件过滤器/事件处理的介绍和使用

事件分发函数 event() 事件分发器&#xff1a;返回值 bool 如果返回时true&#xff0c;代表用户要处理事件&#xff0c;不再分发事件了。 事件对象创建完毕后&#xff0c;Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件&#xff0c;而是将这些事…

PS在图片上直线、虚线、曲线

使用钢笔工具和直线工具都可以画直线&#xff0c;

script的defer和async的理解

场景一 js阻碍了dom元素的渲染 场景二 加了defer&#xff0c;结果跟场景一一样&#xff0c;所以defer对script标签内的代码不期待延迟执行的作用 场景三 script标签没有defer属性&#xff0c;不敢是不是通过src引入代码&#xff0c;结果一样 场景四 加了defer&#xff0c;获…

搭建的svn 1.14.1,拉取代码时候没输入账户密码就报错 auth failed

这边在ubuntu里面搭的svn server&#xff0c;但是拉代码的是否一直报错 auth faield&#xff0c;一开始以为是有auth cache&#xff0c;去设置里面清楚了&#xff0c;windows 里面也清楚了&#xff0c;但是还是报错 问题原因 一直排查才发现&#xff0c;我新增用户的时候&…

SpringBoot中的异常处理器

我们在以上的开发中,统一使用Result返回固定的数据格式给到前端,但是由于程序可能会出现BUG等问题,会导致最终返回给前端的数据,在异常情况下就又不统一了 为了实现在异常情况出现时,也能正常给前端返回统一的数据格式,我们需要使用 异常处理器 定义异常处理器需要使用RestCo…

Mac系统:mysql+jdk+neo4j

mysql 指令 //启动MySQL服务 sudo /usr/local/mysql/support-files/mysql.server start//停止MySQL服务 sudo /usr/local/mysql/support-files/mysql.server stop //连接MySQL数据库&#xff0c;在进行这一步前要先关掉服务 mysql -u root -p //检查MySQL服务状态 sudo /us…

【Unity】ABB CRB 15000 外部引导运动

一、RobotStudio控制器的文件系统和配置参数 HOME&#xff1a;控制器文件系统的根目录或起始点。配置&#xff1a;机器人控制器的配置设置和参数。外件信息&#xff1a;连接到机器人的外部组件的信息。I/O 系统&#xff1a;输入/输出系统&#xff0c;管理机器人和外部设备之间的…

基于dashscope在线调用千问大模型

前言 dashscope是阿里云大模型服务平台——灵积提供的在线API组件。基于它&#xff0c;无需本地加载大模型&#xff0c;通过在线方式访问云端大模型来完成对话。 申请API key 老规矩&#xff1a;要想访问各家云端大模型&#xff0c;需要先申请API key。 对于阿里云&#x…

uniapp图片涂鸦插件(支持多种涂鸦方式,图片放大缩小)

工程地址https://gitee.com/geshijia/ct-graffiti ct-graffiti涂鸦组件使用说明 参考说明 参考链接&#xff1a;https://github.com/ylyuanlu/yl-graffiti 感谢作者的付出&#xff0c;给我提供了一些思路&#xff0c;并做了如下优化&#xff1a; 增加图片放大缩小移动功能添…

UML简述(项目立项、设计、需求整理必备)

UML目录 前言1、UML概述1.1、基本概念1.2、UML图类型说明1.3、UML的41视图 2、UML图详细图示2.1、类图2.2、对象图2.3、组件图2.4、部署图2.5、包图2.6、用例图2.7、状态图2.8、活动图2.9、时序图2.10、通信图&#xff08;协作图&#xff09;2.11、定时图&#xff08;计时图&am…

08 |「Fragment 」

前言 实践是最好的学习方式&#xff0c;技术也如此。 文章目录 前言一、简介1、是什么2、为什么要有 Fragment3. Fragment 详细解释 二、Fragment 与 Activity 的直观理解三、Fragment 的创建1、Fragment 的创建方式2、Fragment 的增删替查1&#xff09; 替换&#xff08;常见&…

哪个牌子宠物空气净化器好?质量好的宠物空气净化器推荐

即使我们很爱自家的宠物&#xff0c;但我们也无法否认处理房间里飘荡的宠物毛发和皮屑&#xff0c;以及那些令人不快的气味&#xff08;比如地毯上的意外和垃圾桶里的气味&#xff09;的挑战。对于过敏患者来说&#xff0c;这几乎是无法忍受的。寻找有效的方法来减少这些问题对…