利用selenium自动完成教学质量测评

简介: 爬虫学习利用selenium模拟浏览器行为

准备工具

  • selenium

    • sudo pip3 install seletinum
  • chromedriver

    • https://chromedriver.chromium.org/downloads
    • 放到/usr/local/bin目录下,代码可以不指定位置

基础知识

selenium 可以通过许多方法定位页面元素,这里简单列举下。

driver = webdrriver.Chrome()

  1. 通过id定位

driver.find_element_by_id()

  1. 通过name定位

driver.find_element_by_name()

  1. 通过tag_name定位

driver.find_element_by_tag_name()

  1. 通过class_name定位

driver.find_element_by_class_name()

  1. 通过css定位

driver.find_element_by_css_selector

  1. 通过xpath定位

driver.find_element_by_xpath

xpath简单语法

表达式 概述
//div 选取所有的div元素
//div[@class="blog-content-box"] 选取class为cblog-content-box的元素
//div/link/@href 选取所有div标签下的link标签的链接
//div/h2/text() 选取 所有div标签下的h2标签之间的内容
//div[1]/p 选取第一个div标签下的p标签的内容
//div[1]/p[last()] 选取第一个div标签下的p标签的最后一个内容
//div[@class^="blog"] 选取所有以blog开头的div标签
etree.HTML(html).xpath('count(//div/form)') 计算所有的div标签下的form标签数量
  1. 通过link定位

driver.find_element_by_link_text()取链接中的所有元素

driver.find_element_by_partial_link_text()取链接中的部分元素

异常处理

frame处理

frame是一个十分大的坑了,如果不注意当前页面的frame,很有可能通过selenium定位不到元素。

frame切换driver.switch_to_frame(driver.find_element_by_tag_name("iframe"))

延时处理

有可能我们的代码跑的太快了,但是当前html页面还没完全加载出来,导致定位不到元素。

  1. 利用sleep延时,绝对延时

time.sleep(秒数)

  1. 隐性延时

最长是30秒,如果30秒内,资源全部加载完成,那么执行后续的代码,30秒内没有加载完成,也会继续执行后续代码。

driver.implicitly_wait(秒数)

  1. 显性等待

等待时长20秒,间隔0.5秒去查询一次目标元素是否加载完成,20秒内加载完成后,执行后续的代码,最长等待20秒,没有加载也会继续执行。

WebDriverWait(driver,20,0.5).until(EC.presence_of_element_located(要草找的元素))

注意这里要查找的元素是元组。

alter弹窗处理

接受driver.switch_to.alert.accept()

忽略driver.switch_to.alert.dismiss()

发送文本driver.switch_to.alert.send_keys(文本内容)

获取文本内容driver.switch_to.alert.text

代码实现

#! /usr/bin/python3.8
import requests
import sys
from selenium import webdriver
import time
from lxml import etree


class Table:
    def __init__(self, number_id, passwd):
        self.url = "学校官网地址"
        self.number_id = number_id
        self.passwd = passwd

    def simulate(self):
        # 启动
        driver = webdriver.Chrome()
        # 最大化
        driver.maximize_window()
        # 地址请求
        driver.get(self.url)
        # 登录
        driver.find_element_by_id("username").send_keys(self.number_id)
        driver.find_element_by_id("password").send_keys(self.passwd)
        driver.find_element_by_class_name("btn_dl").click()
        time.sleep(1)
        # 进入教务系统
        driver.find_element_by_id("157889684646655577").click()
        # 切换到最新的页面
        windows = driver.window_handles
        driver.switch_to.window(windows[-1])
        time.sleep(1)
        # 切换到测评页面
        driver.find_element_by_xpath(
            "/html/body/div[1]/div[1]/div[2]/ul/li[4]/a/span").click()
        driver.find_element_by_xpath(
            "/html/body/div[1]/div[1]/div[2]/ul/li[4]/ul/li[1]/a").click()
        time.sleep(1)
        # 有frame,需要转换
        driver.switch_to_frame(driver.find_element_by_tag_name("iframe"))
        time.sleep(1)
        # 计算有多少门课要测评
        html = etree.HTML(driver.page_source)
        size = html.xpath(
            'count(/html/body/form/div[3]/div/div[2]/div/div[1]/select/option)')
        size = int(size)
        # 利用js完成选项
        commond = "document.getElementById('{}').options[{}].selected = true;"
        for j in range(size):
            # 找到每一门课程有多少个评价
            time.sleep(1)
            html = etree.HTML(driver.page_source)
            id_lists = html.xpath("//td/select/@id")
            for i in id_lists:
                # 防止评价重复
                if i == "DataGrid1_JS1_14" or i == "DataGrid1_JS2_14":
                    end = commond.format(i, 2)
                else:
                    end = commond.format(i, 1)
                driver.implicitly_wait(7)
                # time.sleep(1)
                driver.execute_script(end)
            try:
                time.sleep(2)
                driver.find_element_by_name("Button1").click()
            except Exception as e:
                driver.refresh()
                time.sleep(2)
                driver.find_element_by_name("Button1").click()
            else:
                print("success")
        time.sleep(1)
        driver.switch_to.alert.accept()
        time.sleep(1)
        driver.find_element_by_name("Button2").click()
        time.sleep(5)
        driver.quit()
        print("---end----")

    def run(self):
        print("---start----")
        self.simulate()


if __name__ == "__main__":
    if len(sys.argv) == 3:
        number_id = sys.argv[1]
        passwd = sys.argv[2]
    else:
        print("./文件名 学籍号 密码")
        sys.exit()
    table = Table(number_id, passwd)
    table.run()

注:每个学校的官网不同,需要自己定位到元素操作。

总结

还是直接用js舒服,哈哈哈,js太强了。

js代码:

setInterval(function(){
    var select = document.getElementById("iframeautoheight").contentWindow.document.getElementsByTagName('select');
    for (var j = 1; j < select.length; j++) {
        if (j != select.length - 1) {
            select[j].options[1].selected = true;
        } else {
            select[j].options[2].selected = true;
        }
    }
    if(select.length>16){
        select[10].options[2].selected = true;
    }
    setTimeout(function() {
        var elements = document.getElementById("iframeautoheight").contentWindow.document.getElementsByTagName('input');
        for (var i = 0; i < elements.length; i++) {
            if(elements[i].value == "保  存"){
                elements[i].click();
            }
        }
    }, 1000)
},5000);

setTimeout(function(){
    var element = document.getElementById("iframeautoheight").contentWindow.document.getElementsByTagName('input');
    for (var i = 0; i < element.length; i++) {
        if(element[i].value == " 提  交 "){
            element[i].click();
        }
    }
},62000)

最后还搞了个html输入学籍号和密码,通过post发送给服务器,最后调用自动教学质量测评代码完成,没学过框架,代码写的很烂,就不贻笑大方了。

目录
相关文章
|
7天前
|
Web App开发 前端开发 测试技术
自动化工具 Selenium 的使用
自动化工具 Selenium 的使用
|
2月前
|
监控 测试技术 API
自动化测试工具与电脑桌面监控软件的集成:Selenium与Python的无缝整合
在当今数字化时代,软件质量保证是每个软件开发团队都必须面对的重要挑战之一。自动化测试工具和电脑桌面监控软件的结合,为开发团队提供了一种有效的方式来确保软件的稳定性和性能。本文将介绍如何利用Python编程语言中的Selenium库,与桌面监控软件进行无缝整合,以实现对应用程序的自动化测试和桌面监控。
200 5
|
10月前
|
JavaScript 数据可视化 IDE
测试自动化工具比较:Selenium vs. Cypress
在软件开发过程中,测试自动化是一个关键的环节,它可以提高测试效率和质量,并帮助开发团队更快地交付高质量的软件。在测试自动化领域,Selenium和Cypress是两个备受关注的工具。本文将对它们进行比较,帮助开发者选择适合自己项目的测试自动化工具。
328 0
|
11月前
|
Web App开发 自然语言处理 IDE
自动化测试之 selenium 的安装以及 selenium IDE 录制自动化脚本的用法
1. 什么是自动化测试 1)单元测试 2)接口自动化 3)UI 自动化 2. Selenium 介绍 1)Selenium IDE 2)Webdriver 3)Selenium Grid 3. 如何使用 Selenium IDE 录制脚本 4. 在 python 环境中安装 Selenium 框架
558 0
|
12月前
|
Web App开发 前端开发 Java
测试——自动化测试(Selenium工具)
测试——自动化测试(Selenium工具)
186 1
|
测试技术
软件测试|selenium三种等待方式
软件测试|selenium三种等待方式
62 0
|
测试技术
软件测试|selenium弹窗操作
软件测试|selenium弹窗操作
90 0
|
Web App开发 数据采集 缓存
selenium,自动化测试如何绕开登录2
selenium,自动化测试如何绕开登录2
|
数据采集 测试技术 数据安全/隐私保护
selenium,自动化测试如何绕开登录
selenium,自动化测试如何绕开登录
|
Web App开发 存储 IDE
5分钟学会制作自动化脚本——自动化脚本辅助开发IDE——Selenium IDE介绍(测试工程师必备)
本文介绍了自动化测试的辅助工具,Selenium IDE的基本使用,有助于自动化工程师辅助编辑自动化脚本,初步建立简单自动化脚本。
344 0
5分钟学会制作自动化脚本——自动化脚本辅助开发IDE——Selenium IDE介绍(测试工程师必备)