Selenium 的基本操作你知道哪些?

1. 前言

  今天的推文,我们就来说说看,怎么实现模拟真人去打开微信读书网站。

  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 webdriverfrom selenium.webdriver.common.keys import Keysfrom airtest_selenium.proxy import WebChromefrom 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

 

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023.2版IDEA复制配置修改端口增加一个当前运行服务的操作流程

文章目录 前言操作流程截图 前言 在微服务技术学习中很多学习场景会使用到运行多个服务节点进行调试,想要去模拟集群部署,就需要去复制配置,本文讲解一下如何复制,以及修改端口号。 操作流程截图

现代化木工装备建设新颖校园木工创客室

校园木工创客室是一个集木工制作、创意设计、科技融合与教育实践于一体的多功能空间。它为学生提供了一个动手实践、创新创造的平台,旨在培养学生的动手能力、创新思维、解决问题的能力以及团队协作能力。 木工创客室的设备选择应综合考虑需求、预算、品牌、质量、安…

Git常用技能速成

文章目录 一.版本控制二.提交并推送代码三.提交推送代码 一.版本控制 接下来,我们就需要对我们的功能进行优化,但是需要说明的是,我们不仅仅要对上述提到的缓存进行优化,还需要对我们程序的各个方面进行优化。我们本章节主要是针…

vue3在defineProps中使用多语言t,打包报错

报错原因 代码如下 打包后就会报错 defineProps() in script setup cannot reference locally declared variables because it will be hoisted outside of the setup() function. If your component options require initialization in the module scope, use a separate no…

自定义波形图View,LayoutInflater动态加载控件保存为本地图片

效果图: 页面布局: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="…

关于 RK3588刷镜像升级镜像”没有发现设备“ 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140287339 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

js吸顶导航

吸顶导航 当我们浏览页面篇幅较大&#xff0c;浏览过半的时候想回到导航位置&#xff0c;只能通过往回滚动或通过”回到顶部”重新滚动到导航位置&#xff0c;这样的操作显得繁琐与不便。于是便有了吸顶式导航的交互方式&#xff0c;吸顶条导航最大的好处是将最常用或者设计者最…

命名空间namespace--c++入门基础等

个人主页点这里~ 1.命名空间-namespace 简介 &#xff1a;在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xf…

DataExcelServer局域网文件共享服务器增加两个函数

1、PFSUM合并指定路径下单元格ID的值 PFSUM("/103采购/8月采购名细","amount") 第一个参数为路径&#xff0c;第二个参数为单元格的ID 2、PFQuery 查询路径下 单元格ID值的列表 PFQuery("/103采购/8月采购名细","amount") 查询/103采…

在Mac上一键安装Mysql(解决所有安装问题)

重点强调安装mysql成功的关键在于安装的版本不能是最新&#xff01;&#xff01; 目录 一&#xff1a;下载mysql数据库安装部分到此结束 二&#xff1a;配置mysql数据库三&#xff1a;启动mysql数据库四&#xff1a;各类奇葩问题总结 一&#xff1a;下载mysql数据库 1.进入MyS…

高清图片压缩无水印小程序源码系统 前后端分离 带完整的安装代码包以及搭建教程

系统概述 在当今的数字化时代&#xff0c;图片作为信息传播的重要载体&#xff0c;其质量和传输效率直接影响到用户体验。然而&#xff0c;高清图片往往伴随着较大的文件体积&#xff0c;这不仅会占用大量存储空间&#xff0c;还会拖慢网页或应用的加载速度。因此&#xff0c;…

如何为IP申请SSL证书

目录 以下是如何轻松为IP地址申请SSL证书的详细步骤&#xff1a; 申请IP证书的基本条件&#xff1a; 申请IP SSL证书的方式&#xff1a; 确保网络通信安全的核心要素之一&#xff0c;是有效利用SSL证书来加密数据传输&#xff0c;特别是对于那些直接通过IP地址访问的资源。I…

AUTOSAR NM介绍

AUTOSAR NM介绍 NM简介 NM是Network Management的简称,是出于具体总线网络管理模块与ComM之间的适配层,为ComM提供所有总线网络管理的服务。在AUTOSAR BSW 层中,其上层是通信管理模块(ComM),下层是具体总线网络管理模块(如CanNm,J1939Nm,FrNm,LinNm,UdpNm等)。 为…

leetcode--二叉搜索树中第K小的元素

leetcode地址&#xff1a;二叉搜索树中第K小的元素 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从 1 开始计数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k …

Spring的AOP基础以及AOP的核心概念

2. AOP基础 学习完spring的事务管理之后&#xff0c;接下来我们进入到AOP的学习。 AOP也是spring框架的第二大核心&#xff0c;我们先来学习AOP的基础。 在AOP基础这个阶段&#xff0c;我们首先介绍一下什么是AOP&#xff0c;再通过一个快速入门程序&#xff0c;让大家快速体…

VOS历史话单的非法呼叫话单解决方案,IPSS模块安装到VOS服务器,可大幅度提高安全性!

由于VOS的普及性&#xff0c;不得不承认VOS确实是非常优秀的软交换&#xff0c;但是很多客户在使用过程中都会遇到各种安全问题&#xff0c;比如话费被盗用了&#xff0c;历史话单一堆的非法呼叫话单&#xff0c;严重的影响到了话务安全&#xff0c;并不是那点话费的事了&#…

基于Java+SpringMvc+Vue技术的药品进销存仓库管理系统设计与实现系统(源码+LW+部署讲解)

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

python库(8):re库实现字符串处理

1 re库简介 Python 的re库是一个功能强大的正则表达式模块&#xff0c;它允许用户执行各种复杂的字符串匹配和处理任务。 以下是re库的主要功能&#xff1a; 搜索&#xff1a;re.search() 用于搜索字符串中第一次出现的模式。匹配&#xff1a;re.match() 从字符串的开始位置…

echarts实现3D饼图

先看下最终效果 实现思路 使用echarts-gl的曲面图&#xff08;surface&#xff09;类型 通过parametric绘制曲面参数实现3D效果 代码实现 <template><div id"surfacePie"></div> </template> <script setup>import {onMounted} fro…

烧烤炉发霉怎么处理 烧烤炉发霉的原因分析

仓库储存的烧烤炉表面布满了霉菌是什么原因&#xff1f;烧烤炉发霉不仅影响外观和卖点&#xff0c;若是出口给到客户手上还会导致面临客户的索赔的问题 &#xff0c;经ihaoer防霉人士介绍烧烤炉发霉处理方法如下&#xff1a; 烧烤炉发霉的原因分析 一、储存的环境潮湿&#xff…