selenium写一个自动化程序查看作业的未提交名单

selenium写一个自动化程序

7.17

  1. 结合selenium写一个自动化程序,完成的功能(看哪些人提交了,哪些人没提交)
  • 遇到的难点1:定位某一个用户名

  • 解决方案1:元素定位并优化

    • 经常使用的jupyter快捷键命令

      Alt + Enter : 运行本单元,在下面插入一单元

      Shift-Enter : 运行本单元,选中下个单元

      Ctrl-Enter : 运行本单元

      Shift + Tab : 提示(对于函数的提示)
      Ctrl + Shift + - : 分割单元
      ctrl + D : 删除该行内容
      ctrl + U : 撤销
      ctrl + / : 注释

    • 元素定位的方法

      首先,右击→检查→F12中定位到对应位置

      新闻

      • 根据id定位:element = web.find_element_by_id(“kw”)
      • 根据name定位:element = web.find_element_by_name(“wd”)
      • class name定位:element = web.find_element_by_class_name(‘s_ipt’)
      • 根据tag定位:element = web.find_element_by_tag_name(‘input’)
      • link text定位:element = web.find_element_by_link_text(‘新闻’)
      • partial link text定位:element = web.find_element_by_partial_link_text(‘闻’)
      • XPath定位:绝对路径右击→copy→copy full xpath;相对路径(推荐!)右击→copy→copy xpath;find_element_by_xpath
      • css selector定位:右击→copy→copy selector element = web.find_element_by_css_selector(“#kw”);element = web.find_element_by_css_selector(“.s_ipt”);element = web.find_element_by_css_selector(“input”);element = web.find_element_by_css_selector(‘[id=“kw”]’)
        ;element = web.find_element_by_css_selector(‘input[id=“kw”]’);element=web.find_element_by_css_selector(‘[class=“s-top-left-new s-isindex-wrap”]’)(属性带空格,只能用css selector)
    • 另一种表达

      from selenium.webdriver.common.by import By
      element = web.find_element(By.ID,‘kw’)
      element = web.find_element(By.NAME,‘wd’)
      element = web.find_element(By.CLASS_NAME,‘s_ipt’)
      element = web.find_element(By.TAG_NAME,‘input’)
      element = web.find_element(By.LINK_TEXT,‘新闻’)
      element = web.find_element(By.PARTIAL_LINK_TEXT,‘闻’)
      element = web.find_element(By.XPATH,‘//*[@id=“kw”]’)
      element = web.find_element(By.CSS_SELECTOR,‘#kw’)
      element = web.find_element(By.CSS_SELECTOR,‘[id=“kw”]’)
      element = web.find_element(By.CSS_SELECTOR,‘input[id=“kw”]’)

    • 定位方法选择

      id>name>css>XPath

      定位多个元素,就是把上述element后面多了复数标识s,变为elements,其他操作一致。

  • 已完成:可定位某一个提交的用户名

  • 遇到的难点2:某一页中循环定位多个已提交的用户

  • 解决方案2

    使用循环遍历range(224873, 224882)来构建每个id对应的XPath表达式。然后,通过driver.find_element()方法和XPath表达式定位到对应的用户名元素。如果找到了用户名元素,则获取其文本内容并打印出来。如果未找到用户名元素,会打印相应的提示信息。

  • 已完成:可查出某一页中多个用户名

  • 遇到的难点3:翻页定位全部已提交的用户

  • 解决方案3

    • 动态获取page

      使用driver.find_element_by_xpath()方法和XPath表达式’//div[@class=“page”]'来定位包含页数信息的元素。然后,我们使用text属性获取该元素的文本内容。接下来,我们通过解析文本内容,获取页数的数值。

    • 动态获取每一页的id

      使用driver.find_elements()方法和XPath表达式’//*[@id]'来获取页面中所有包含id属性的元素。然后,我们遍历这些元素,通过get_attribute(‘id’)方法获取每个元素的id值。如果id值以pid开头,我们构建相应的XPath表达式,并使用driver.find_element()方法进行定位。

    • 联合

  • 已完成:可查出全部已提交的用户名

  • 遇到的难点4:已提交的用户会有重复的(原因在于有人发布了多条信息(如帮忙代交、超级版主发布了多条信息等))

  • 解决方案4:

    创建了一个集合printed_usernames来存储已经打印过的用户名。在遍历每个用户名时,我们首先检查用户名是否已经存在于集合中,如果不存在,则打印用户名并将其添加到集合中,否则跳过打印。

  • 已完成:可查出已提交的去重后的用户名

  • 遇到的难点5:对比已有名单,给出未交名单

  • 解决方案4:

  • 已完成:给出未提交作业的名单

代码

#安装需要的包
#并且下载对应谷歌浏览器版本的谷歌驱动 最好放在anaconda1的安装目录下  http://chromedriver.storage.googleapis.com/index.html
from selenium import webdriver
from selenium.webdriver.common.by import By# 访问首页
browser = webdriver.Chrome()
#这里是提交作业的网址
browser.get(r'http://')#动态获得page的页数
page_element = browser.find_element_by_xpath('//*[@id="ct"]/div[6]/div')
page_text = page_element.text
page_number = int(page_text.split(' ')[1])
print(page_number)#获取已提交的用户名单
# 创建一个集合用于存储已经打印过的用户名
printed_usernames = set()# 创建一个计数器变量来记录已经打印过的用户名数量
username_count = 0# 循环遍历页面范围
for page in range(1, page_number+1):# 构建页面URLurl = f'http://&page={page}'# 打开网页browser.get(url)# 获取页面中包含id的元素elements = browser.find_elements(By.XPATH, '//*[@id]')# 遍历元素,获取id值并进行定位for element in elements:element_id = element.get_attribute('id')if element_id.startswith('pid'):# 构建XPath表达式xpath = f'//*[@id="{element_id}"]/tbody/tr[1]/td[1]/div[1]/div/a'try:# 定位用户名元素username_element = browser.find_element(By.XPATH, xpath)# 获取用户名文本username = username_element.text# 检查用户名是否已经打印过,若未打印过则打印并加入集合,并增加计数器if username not in printed_usernames:print(username)printed_usernames.add(username)username_count += 1except:print(f'未找到id为 {element_id} 的用户名元素')# 输出统计的用户名数量
print(f'已提交的用户数量:{username_count}')#获取未提交的用户名单
#已知的用户名单
known_usernames = ["***", "***"
]
# 获取未提交的用户名列表
unsubmitted_usernames = [username for username in known_usernames if username not in printed_usernames]# 输出未提交的用户名列表
for username in unsubmitted_usernames:print(username)

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

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

相关文章

Java实现简单的王者荣耀游戏

一、创建新项目 首先创建一个新的项目,并命名为wangzherongyao。 其次在飞翔的鸟项目下创建一个名为img的文件夹用来存放游戏相关图片。详细如下图: 二、游戏代码 1、创建怪物类 1.bear: package beast;import wangzherogyao.GameFrame;…

Java给钉钉机器人发送消息

示例代码 import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets;/*** author : yx-0176* description* date : 2023/11/27*/ public a…

数据结构与算法之递归: LeetCode 46. 全排列 (Typescript版)

全排列 https://leetcode.cn/problems/permutations/ 描述 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,…

a-table:表格组件常用功能记录——基础积累2

antdvue是我目前项目的主流,在工作过程中,经常用到table组件。下面就记录一下工作中经常用到的部分知识点。 a-table:表格组件常用功能记录——基础积累2 效果图1.table 点击行触发点击事件1.1 实现单选 点击事件1.2 实现多选 点击事件1.3 实…

知识社区问答平台源码系统 开源的知识问答平台 附带完整的搭建教程

互联网的快速发展,人们对于知识的需求越来越高。知识社区问答平台源码系统是一款基于开源框架搭建的知识问答平台,旨在帮助人们快速、准确地获取所需知识,提高学习效率。 以下是部分代码示例: 系统特色功能一览: 1.知…

坚守合规底线 波场TRON将联合多方不断提升合规水平

数字化时代,区块链和加密技术因其去中心化、全球化及透明度等优势在金融科技领域备受关注,但与此同时,一些风险事件的发生也暴露了行业合规化缺乏等问题的存在。近期,有媒体报道称,波场TRON或成为少数非法组织尤其是美国认定的恐怖组织融资的工具。对此,波场TRON与其创始人孙宇…

进阶必看:一文搞懂中台战略与企业架构关系

摘要 随着数字化时代的到来,企业在不断追求创新和效益的过程中,中台战略逐渐成为企业转型的关键一环。本文将深入剖析中台战略与企业架构之间的关系,探讨中台战略对企业架构的升华和重构。 1. 中台战略的定义与背景 中台战略是指在企业内部建…

什么是消息队列

什么是消息队列 MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出队列,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,M…

Android预加载Apk时注意事项

1.对于Apk中存在依赖的so库时,编写预加载库mk文件时需要将Apk解压的库链接过来,否则就会出现找不到so或者找到so库但是无法正常使用的情况(系统apk查找库的方式是先查找链接库后查找system/lib目录下的库,且采用预加载库方式apk中依赖的库默认…

二叉树leetcode(求二叉树深度问题)

today我们来练习三道leetcode上的有关于二叉树的题目,都是一些基础的二叉树题目,那让我们一起来学习一下吧。 https://leetcode.cn/problems/maximum-depth-of-binary-tree/submissions/ 看题目描述是让我们来求出二叉树的深度,我们以第一个父…

HT for Web (Hightopo) 使用心得(5)- 动画的实现

其实,在 HT for Web 中,有多种手段可以用来实现动画。我们这里仍然用直升机为例,只是更换了场景。增加了巡游过程。 使用 HT 开发的一个简单网页直升机巡逻动画(Hightopo 使用心得(5)) 这里主…

a-modal拖拽弹框

drag.js export default {install(Vue) {// v-dialogDrag: 弹窗拖拽Vue.directive(dragModal, (el, bindings, vnode) > {Vue.nextTick(() > {const { visible, destroyOnClose } vnode.componentInstance// 防止未定义 destroyOnClose 关闭弹窗时dom未被销毁&#xff…

UWB高精度定位系统项目源码

在现代社会中,精准定位技术对于各行各业都至关重要。为了满足对高精度定位的需求,超宽带(Ultra-Wideband, UWB)技术应运而生。UWB高精度定位系统以其出色的定位精度和多样化的应用领域而备受关注。本文将深入探讨UWB高精度定位系统…

2024年计算机毕业设计选题(私聊获取源码或代做)

1、基于SpringBoot的养老院管理系统的设计与实现 2、基于SpringBoot的网上购物商城的设计与实现 3、基于SpringBoot的旅游网站的设计与实现 4、基于SpringBoot的网上点餐系统的设计与实现 5、基于SpringBoot的阿博图书馆管理系统的设计与实现 6、基于SpringBoot的足球青训…

向量场中的几个恒等式

向量场中的几个恒等式 1. ∇ 2 A ∇ ∇ ⋅ A − ∇ ∇ A \nabla ^2 A \nabla \nabla\cdot A-\nabla \times\nabla\times A ∇2A∇∇⋅A−∇∇A 2. ∇ ⋅ ∇ A 0 \nabla \cdot \nabla \times A 0 ∇⋅∇A0 3. ∇ ∇ ϕ 0 \nabla \times \nabla \phi0 ∇∇ϕ0

SCAU:2023年ACM校赛网上预赛(23级组别)

报数 Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: 不限定 描述: 给定两个正整数a和b,用英语从a到b计数。根据a和b的大小关系,可能是正着数,也可能是倒着数。 输入格式: 第一行包含t&#xff0…

学习记录684@vue 统计用户页面停留时间

需求 想要统计用户在页面停留的真实时间,进入页面开始计时,切出本页面后完毕,另外需要注意关闭浏览器网页窗口或者关闭整个浏览器也要停止计时。 代码实现 data() {return {browseTime: 0, // 浏览时长初始值为 0clearTimeSet: null}},moun…

数据库服务器的配置要求

随着信息化的不断发展,数据库已经成为企业级应用的重要组成部分。安装数据库不仅是构建企业级应用的基础,也是保障数据安全和数据完整性的关键环节。数据库服务器的配置选择需要根据需求、使用情况多方面考虑。 以下是一些常见的配置要求: 1…

Kubernetes之kubeadm集群监控篇—prometheus 部署

配置文件编辑 # cat prometheus-config.yamlapiVersion: v1 kind: Namespace metadata:name: kube-prom --- apiVersion: v1 kind: ConfigMap metadata:name: prometheus-confignamespace: kube-prom data:prometheus.yml: |global:scrape_interval: 10sevaluation_interv…