在现代的网页自动化测试和操作中,Selenium 是一个强大的工具。尝试用它完成了保持一个网课页面活跃的脚本,完成了登录、模拟键盘操作、定时刷新页面,并在学习时长达到一定条件时终止脚本。

什么是 Selenium?

Selenium 是一个开源的网页自动化测试工具,它提供了一系列库和驱动,用于与各种浏览器进行交互。Selenium 可以模拟用户在网页上的各种操作,如点击、输入、滚动等,从而实现自动化测试、网页抓取、自动登录等任务。它支持多种编程语言,包括 Python、Java、C#、Ruby 等,广泛应用于网页自动化测试和操作领域。

环境准备

  1. 安装 Selenium

    pip install selenium
    
  2. 下载 ChromeDriver
    访问 ChromeDriver 下载页面并下载与你的 Chrome 浏览器版本相匹配的 ChromeDriver。
    ChromeDriver 是一个独立的可执行文件,它实现了 WebDriver 的标准协议,可以控制 Chrome 浏览器的行为。它允许 Selenium 脚本与 Chrome 浏览器进行交互,执行自动化测试或其他任务。要使用 ChromeDriver,你需要下载它并将其路径添加到你的系统环境变量中,或者在脚本中明确指定其路径。

编写脚本

准备编写一个保持网课界面活跃浏览的简单脚本,要求就是键盘上下操作,然后每隔两分钟刷新。然后因为打开以后先是登录的界面,所以要填写用户名密码,然后暂停等待人工输入验证码后开始操作。用户名密码栏在实际情况中可以自己在浏览器的开发者模式中查看元素名称,根据实际情况进行更改。

以下是脚本,每两分钟刷新一次页面,运行总时长为5小时:

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

# 设置 ChromeDriver 的路径
chrome_driver_path = 'C:/path/to/chromedriver/chromedriver.exe'  # 替换为你的 ChromeDriver 路径

# 初始化浏览器
service = Service(executable_path=chrome_driver_path)
driver = webdriver.Chrome(service=service)

# 打开目标网站
driver.get('https://example.com')

# 等待页面加载
time.sleep(5)

# 输入用户名和密码,替换为实际的用户名和密码
username = 'your_username' 
password = 'your_password'

# 定位并填写用户名和密码字段,根据实际 HTML 结构替换元素的定位方式
driver.find_element(By.NAME, 'args[username]').send_keys(username)
driver.find_element(By.NAME, 'args[userpassword]').send_keys(password)

# 暂停脚本,等待用户手动输入验证码并登录
input("请手动输入验证码并完成登录后,按回车继续...")

# 确认登录成功,可以等待一段时间确保登录完成
time.sleep(5)

# 设置脚本结束时间为5小时后
end_time = time.time() + 5 * 60 * 60

try:
    while time.time() < end_time:
        # 模拟按下上下键
        body = driver.find_element(By.TAG_NAME, 'body')
        body.send_keys(Keys.ARROW_DOWN)
        time.sleep(2.5)
        body.send_keys(Keys.ARROW_UP)
        time.sleep(2.5)

        # 每两分钟刷新一次页面
        if int(time.time()) % 120 < 5:
            driver.refresh()
            time.sleep(5)

except KeyboardInterrupt:
    print("Script terminated by user.")

finally:
    # 关闭浏览器
    driver.quit()

在这个脚本中:

  1. time.sleep(2.5):每2.5秒模拟一次上下滚动,总共每5秒滚动一次。
  2. end_time = time.time() + 5 * 60 * 60:设置脚本运行5小时。
  3. if int(time.time()) % 120 < 5:每2分钟刷新一次页面,刷新后等待5秒让页面重新加载。

运行这个脚本,浏览器会每两分钟刷新一次页面,并持续运行5小时。在这期间,每5秒钟进行一次上下滚动。

进一步完善定时操作和时长检查

在现在的基础上,因为想让脚本检查页面显示的时间,在完成要求后自动停止,所以在前端查看了学习时长的元素,通过确认元素定位检查提取的文本:在解析之前打印出提取的文本,确保它是我们期望的格式、修正正则表达式:确保正则表达式能够正确匹配提取的文本,这一系列思路来达成这个需求。这样我们可以有设置持续时间,或者自动检测是不是达成要求两个方式。

现在,假如我们需要将脚本改为在学习时长达到3小时30分时停止。

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import re

# 设置 ChromeDriver 的路径
chrome_driver_path = 'C:/path/to/chromedriver/chromedriver.exe'  # 替换为你的 ChromeDriver 路径

# 初始化浏览器
service = Service(executable_path=chrome_driver_path)
driver = webdriver.Chrome(service=service)

# 打开目标网站
driver.get('https://example.com')

# 等待页面加载
time.sleep(5)

# 输入用户名和密码,替换为实际的用户名和密码
username = 'your_username' 
password = 'your_password'

# 定位并填写用户名和密码字段
driver.find_element(By.NAME, 'args[username]').send_keys(username)
driver.find_element(By.NAME, 'args[userpassword]').send_keys(password)

# 暂停脚本,等待用户手动输入验证码并登录
input("请手动输入验证码并完成登录后,按回车继续...")

# 确认登录成功,可以等待一段时间确保登录完成
time.sleep(5)

# 设置脚本结束时间为5小时后
end_time = time.time() + 5 * 60 * 60

def extract_time_from_text(text):
    """从文本中提取学习时长"""
    match = re.search(r'学习时长:(\d+)时(\d+)分', text)
    if match:
        hours = int(match.group(1))
        minutes = int(match.group(2))
        return hours, minutes
    return 0, 0

try:
    while time.time() < end_time:
        # 模拟按下上下键
        body = driver.find_element(By.TAG_NAME, 'body')
        body.send_keys(Keys.ARROW_DOWN)
        time.sleep(2.5)
        body.send_keys(Keys.ARROW_UP)
        time.sleep(2.5)

        # 每两分钟刷新一次页面并检查学习时长
        if int(time.time()) % 120 < 5:
            driver.refresh()
            time.sleep(5)

            # 检查学习时长
            try:
                element = driver.find_element(By.XPATH, "//div[contains(text(), '学习时长')]")
                text = element.text
                print(f"提取的文本:{text}")  # 打印出提取的文本用于调试
                hours, minutes = extract_time_from_text(text)
                print(f"当前学习时长:{hours}{minutes}分")

                # 如果学习时长达到或超过12小时30分,终止脚本
                if hours > 3 or (hours == 3 and minutes >= 30):
                    print("学习时长达到3小时30分,脚本终止。")
                    break

            except Exception as e:
                print(f"检查学习时长时出错:{e}")

except KeyboardInterrupt:
    print("Script terminated by user.")

finally:
    # 关闭浏览器
    driver.quit()

在这个脚本中:

  1. 定义函数extract_time_from_text 用于从文本中提取学习时长(小时和分钟)。
  2. 刷新页面并检查学习时长:每两分钟刷新一次页面,并查找具有 col-xs-3 类的元素。然后从其文本中提取学习时长。

结语

本文简单介绍了如何使用 Selenium 实现浏览器自动化操作,记录分享了一下自己尝试编写的包括登录、模拟键盘操作、定时刷新页面并在特定条件下终止的浏览器自动化脚本。

Logo

一站式 AI 云服务平台

更多推荐