Airtest-Selenium实操小课④:微信读书上阅读书籍

news2024/11/25 7:44:25

1. 前言

上一课我们讲到用Airtest-Selenium爬取下载可爱的猫猫图片,还没看的同学可以戳这里看看~

那么今天的推文,我们就来说说看,怎么实现模拟真人去打开微信读书网站,点击进入书本进行阅读。

2.需求分析和准备

整体的需求大致可以分为以下步骤:

  • 打开chrome浏览器
  • 打开百度网页
  • 搜索“微信读书”
  • 点击进入“微信读书”官网
  • 搜索关键词“长安的荔枝”
  • 点击进入“长安的荔枝”书本
  • 翻阅书籍前五章内容

在写脚本之前,我们需要准备好社区版AirtestIDE(目前最新版为1.2.17),设置好chrome.exe地址和对应的driver即可。

3. 脚本实现与运行效果

3.1 脚本运行效果

在运行过程中,我们将每次的搜索结果通过读取url链接的方式去实现页面跳转,在进入到书籍阅读界面时,根据读取到的页面高度、文档高度、去计算可滑动高度,实现滑动阅读的操作。并且根据页面的JS距离去判断是否已经滑动到文档底部,从而执行点击下一章的操作。

先来看下我们整体的运行效果:

在这里插入图片描述

3.2 完整代码分享

这里也附上完整的示例代码给大家参考,有需要的同学可以自取学习哦:

# -*- encoding=utf8 -*-
__author__ = "Airtest"

from airtest.core.api import *
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from airtest_selenium.proxy import WebChrome
from selenium.webdriver.common.by import By

# 创建一个实例
driver = WebChrome()
driver.implicitly_wait(20)

def start_selenium():
    driver.get("https://www.baidu.com/")
    # 输入搜索关键词并提交搜索
    search_box = driver.find_element_by_name('wd')
    search_box.send_keys('微信读书')
    search_box.submit()

    # 获取搜索结果并打开新页面
    open_new_page()

    # 滚动页面并阅读章节
    read_chapters()


def open_new_page():
    # 使用XPath查找文本为 "微信读书" 的元素并点击
    try:
        element = driver.find_element_by_xpath("//div[@id='content_left']/div[@id='1']/div[@class='c-container']/div[1]/h3[@class='c-title t t tts-title']/a")
    except Exception as e:
        element = driver.find_element_by_xpath('//*/text()[normalize-space()="微信读书"]/parent::*')
    element.click()

    # 获取所有窗口句柄
    window_handles = driver.window_handles
    # 切换到新打开的窗口
    driver.switch_to.window(window_handles[1])
    # 获取新页面的链接
    new_page_url = driver.current_url
    # 打印新页面的链接
    print(f"新页面的链接: {new_page_url}")
    driver.get(new_page_url)
    
    #点击搜索书籍《长安的荔枝》
    driver.find_element_by_xpath("//input[@type='text']").click()
    driver.find_element_by_xpath("/html/body/div[7]/div/div/div[2]/div/input").send_keys("长安的荔枝")
    driver.find_element_by_xpath("/html/body/div[7]/div/div/div[2]/span[2]").click()


    # 获取a标签的URL以及书籍简介
    search_box = driver.find_element_by_xpath("/html/body/div[7]/div/div[3]/div/ul/li/a")
    print(f"a标签的文本: {search_box.text}")
    url = search_box.get_attribute('href')
    # 打印URL
    print(f"URL: {url}")
    driver.get(url)  # 请求搜索链接-跳转

#开始阅读
def read_chapters():
	#切换上下滚动阅读模式
    button = driver.find_element(By.CSS_SELECTOR,"button[title='切换到上下滚动阅读'].readerControls_item.isHorizontalReader")
    button.click()

    for i in range(5):  # 阅读章节5章
        # 滚动到页面最下方
        scroll_to_bottom()
        sleep(5)
        # 点击下一章节按钮
        next_chapter = driver.find_element(By.XPATH,"//div[@class='readerFooter']/div/button[@class='readerFooter_button']")
        next_chapter.click()

#滑动书籍
def scroll_to_bottom():
    while True:
        is_bottom = driver.execute_script('return (window.innerHeight + window.pageYOffset) >= document.documentElement.scrollHeight;')
        # 判断是否滚动到屏幕最底部
        if not is_bottom:
            # 获取页面高度
            heig_ = driver.execute_script("return document.body.scrollHeight;")
            # 获取当前页面底部距离顶部的距离
            next_ = driver.execute_script("return (window.innerHeight + window.pageYOffset);")
            # 计算滚动距离
            p_num = heig_ / 1000
            print(heig_ / 1000)
            # 滚动到页面最下方
            driver.execute_script(f"window.scrollTo(0, {p_num + next_});")
            sleep(2)
        else:
            print('已滚动到屏幕最底部')
            break

#管理 WebDriver 的生命周期
class SeleniumDriver:
    def __enter__(self):
        return driver

    def __exit__(self, exc_type, exc_val, exc_tb):
        pass


if __name__ == "__main__":
    with SeleniumDriver():
        start_selenium()
3.2 重要知识点
1)返回当前页面的文档在垂直方向上的高度
driver.execute_script("return document.body.scrollHeight;")
2)获取当前页面可见区域的高度和页面滚动距离
driver.execute_script("return (window.innerHeight + window.pageYOffset);")

3) 判断页面是否已经滚动到底部

driver.execute_script('return (window.innerHeight + window.pageYOffset) >= document.documentElement.scrollHeight;')
4)管理WebDriver的生命周期

如果不需要完成任务后就关闭浏览器的话,可以在exit的时候直接pass处理,如果需要立即关闭浏览器的话,可以选择在exit函数内填入driver.close()

class SeleniumDriver:
    def __enter__(self):
        return driver

    def __exit__(self, exc_type, exc_val, exc_tb):
        pass

4. 注意事项与小结

4.1 相关教程
  • 如何使用Airtest-selenium进行web端的页面元素交互
  • 如何设置chromedriver以及一些常见的web脚本问题
  • 为什么AirtestIDE无法检索web控件?
4.2 课程小结

在本周的课程中,我们介绍了如何使用Airtest-selenium在微信读书web端上模拟阅读书籍的操作,也分享了Airtest-selenium比较常见的获取滑动距离、计算滑动距离以及判断是否到底部的用法。但是,请大家注意,我们的分享仅供学习参考哦!我们分享的代码并不是永远适用的,因为网页的页面元素可能会不断更新。

同时,我们也非常欢迎同学们能够提供自己常用场景的代码,我们会积极分享相关的使用技巧。让我们一起努力,共同进步~

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

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

相关文章

告别繁琐录入,一键解锁OCR魅力:高效文字识别工具推荐

在日常工作中,我们常常会需要找一些模版,如果直接下载编辑某某文档,都是要花钱的。 比如领导让我找个法律文书,改成我们的内容,网上有很多的参考文档,但是不论哪个,下载都要钱,也不…

STM32 CAN总线通讯

使用STM32的CAN通讯,利用回环模式,按键控制发送CAN数据,中断接收CAN数据并通过串口助手打印出来。 7.2、配置引脚信息 由于每次新建工程都需要配置信息,比较麻烦,好在STM32CubeIDE提供了导入.ioc文件的功能&#xff…

阿里云PAI主机网页访问测试

笔者使用的阿里云平台PAI主机(首次使用免费三个月额度),由于其默认不设置公网IP,所以在该主机上启动HTTP服务后无法访问测试。 这里使用ssh来作隧道穿透,首先需要配置ssh。 云主机配置ssh 1. 修改root账号密码 在云主机上执行 passwd ro…

图片转pdf,图片转pdf在线转换,在线图片转pdf

图片转PDF,听起来似乎是一个简单的操作,但实际上,它涉及到许多细节和技巧。有时候我们需要将图片转换为PDF格式,以便于分享、打印或保存。那么,如何将图片转换成PDF呢?接下来,我将为您详细介绍几…

电脑系统重装怎么操作?分享四个win10重装系统方法

“我遇到了一些笔记本电脑的问题,别人告诉我解决这个问题需要重新安装Win10电脑系统。但我不记得我把光盘放在哪里了,我能否在不丢失文件的情况下重新安装操作系统?电脑系统重装怎么操作?”虽然电脑自带系统中有多种方法可供选择&…

有哪些常用ORM框架

ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,它允许开发者使用面向对象的编程语言来操作关系型数据库。ORM的主要目的是将数据库中的数据表映射到编程语言中的对象,从而使得开发者可以使用对象的方式来…

Docker之overlay2的迁移

原因 docker默认将文件及其容器放置在了系统盘的挂载区内,如果长期使用会发现系统挂载区被overlay2挤爆了,因此在一开始我们将其迁移在大容量外挂磁盘上,就可以避免系统盘被挤爆,放心使用. 具体操作 # 停止容器 systemctl stop docker# 修改容器配置&#xff0c…

Spring+SpringMVC介绍+bean实例化+依赖注入实战

Spring介绍 Spring是一个轻量级的Java 开发框架,核心是IOC(控制反转)和AOP(面向切面编程) Spring解决了业务层(Service包)与其他各层(表现层,包括Model,Vie…

无版权图片素材搜索网站,解决无版权图片查找问题

在数字内容创作领域,图片素材的选择至关重要。一张高质量、合适的图片不仅能够吸引读者的眼球,还能有效传达信息。然而,找到既免费又无版权限制的图片素材并非易事。小编将为大家介绍几个解决这一问题的无版权图片素材搜索网站,这…

程序猿大战Python——面向对象——对象属性

什么是属性 目标:了解什么是属性? 在现实生活中,属性就表示固有特征,比如:一辆小轿车的属性有轮胎数、颜色、品牌等。 仔细观察后会发现,属性可以简单理解为与生俱来的特征,比如一个人的姓名、年…

Lazada API接口——一键获取商品买家评论数据信息

一、引言 在电商领域,买家评论是商品销售中不可忽视的重要因素。它们不仅影响着潜在消费者的购买决策,还为商家提供了宝贵的客户反馈。为了满足商家和数据分析师对买家评论数据的需求,我们特别开发了一款针对Lazada平台的接口,其…

30分钟完成一个AI视频,跑通0到1的过程,包含文生图,图生视频的制作

关注公众号,赠送AI/Python/Linux资料 步骤一:写故事 需要给出故事情节,让kimi首先提供一个提示词模版 提示词输入后,就让kimi开始写故事了 一个完整的故事就出来了 非常好,描述一个IT人的一生是一个宏大的主题&#…

后台管理台字典localStorage缓存删除

localStorage里存放了如以下dictItems_开头的字典数据,localStorage缓存是没有过期时间的,需要手动删除。同时localStorage里还存有其他不需要删除的数据。 这里的方案是遍历localStorage,利用正则和所有key进行匹配,匹配到dict…

【有手就会】图数据库Demo教程,实现《诡秘之主》中的人物关系探索

前言 星环社区版家族于近期发布了单机、30s一键启动的StellarDB图数据库,本篇文章将为用户介绍如何使用开发版StellarDB实现人物关系探索。 友情链接:白话大数据 | 关于图数据库,没有比这篇更通俗易懂的啦 TDH社区版本次发布StellarDB社区…

如何选择合适的半桥栅极驱动芯片?KP8530X,KP85402,KP85211A满足你对半桥栅极驱动一切需求

半桥栅极驱动系列KP8530X,KP85402,KP85211A在功率电子领域展现出卓越的性能和可靠的品质。具备诸多显著优势。首先,半桥栅极驱动系列KP8530X,KP85402,KP85211A拥有出色的耐压性能,可承受高达数百伏的电压&a…

ArcGIS制作规划图卫星影像地图虚化效果

文章目录 一、效果展示二、加载数据三、效果制作四、注意事项一、效果展示 二、加载数据 订阅专栏后,从csdn私信查收实验数据资料,加载ArcGIS制作规划图卫星影像地图虚化效果.rar中的数据,如下所示: 三、效果制作 1. 创建掩膜图层 新建一个矢量图层,因为主要是作图需要…

GNSS边坡监测站

TH-WY1随着科技的飞速发展,各种先进的监测技术不断涌现,为边坡安全监测提供了有力保障。其中,GNSS边坡监测站以其高精度、实时性强的特点,受到了广泛关注。 GNSS边坡监测站,全称为全球导航卫星系统边坡监测站&#xf…

1.接口测试-postman学习

目录 1.接口相关概念2.接口测试流程3.postman基本使用-创建请求(1)环境(2)新建项目集合Collections(3)新建collection(4)新建模块(5)构建请求请求URLheader设…

湖南省物联网挑战赛教学平台使用说明文档

1物联网教学平台硬件连接 1.1硬件介绍 1)物联网教学平台实验箱 2)物联网硬件平台 3)无线传感器节点 4)智能烧录平台 1.2连线 注:智能烧录平台上的USB接口必须与物联网硬件平台“开关”那一面最右侧USB接口连接 1.3修…

小红书xs-xt解密

在进行小红书爬虫的时候,有一个关键就是解决动态密文的由来 这边用atob对X-S密文进行解密 可以看到他是一个字符串 可以发现他本来是一个json对象,因为加密需要字符串,所以将json对象转化 为了字符串 而在js中,常用JSON.stringify进行json对象到字符串的转化。 这边将JS…