Selenium是广泛使用的模拟浏览器运行的库

简介

Selenium是广泛使用的模拟浏览器运行的库,它是一个用于Web应用程序测试的工具。 Selenium测试直接运行在浏览器中,就像真正的用户在操作一样,并且支持大多数现代 Web 浏览器。

环境

安装

pip install selenium
下载Chrome驱动
系统环境配置添加驱动所在路径

基础用法

1、页面操作

  1. 初始化浏览器对象
from selenium import webdriver# Chrome浏览器
browser = webdriver.Chrome()
  1. 访问页面
from selenium import webdriver
import time# Chrome浏览器
browser = webdriver.Chrome()# # 指定绝对路径的方式(可选)
# path = r'绝对路径\chromedriver.exe'
# browser = webdriver.Chrome(path)browser.get("https://www.baidu.com")
  1. 前进后退
from selenium import webdriver
import time# Chrome浏览器
browser = webdriver.Chrome()browser.get("https://www.baidu.com")
time.sleep(2)打开淘宝页面
browser.get('https://www.bilibili.com/')
time.sleep(2)# 后退到百度页面
browser.back()
time.sleep(2)# 前进的淘宝页面
browser.forward()
time.sleep(2)# 关闭浏览器
browser.close()
  1. 获取页面基础属性
# 网页标题
print(browser.title)
# 当前网址
print(browser.current_url)
# 浏览器名称
print(browser.name)
# 网页源码
print(browser.page_source)

2、定位页面元素

属性函数
CLASSfind_element(by=By.CLASS_NAME, value=‘’)
XPATHfind_element(by=By.XPATH, value=‘’)
LINK_TEXT (定位文本 精准)find_element(by=By.LINK_TEXT, value=‘’)
PARTIAL_LINK_TEXT (定位文本 模糊)find_element(by=By.PARTIAL_LINK_TEXT, value=‘’)
TAG (整个页面所有指定标签 比如value=‘div’)find_element(by=By.TAG_NAME, value=‘’)
CSSfind_element(by=By.CSS_SELECTOR, value=‘’)
IDfind_element(by=By.ID, value=‘’)

from selenium import webdriver
import time
from selenium.webdriver.common.by import By# Chrome浏览器
browser = webdriver.Chrome()browser.get("https://www.51kim.com/")
element = browser.find_element(by=By.CLASS_NAME, value="copyright").text
# element=browser.find_element(by=By.ID,value='kw').text
print(element)
time.sleep(2)# 关闭浏览器
browser.close()
//css
a1 = driver.find_element(By.CSS_SELECTOR,'#livenews-id-1-202301272620081211 > div.media-content > h2 > a').text//xpath
driver.find_elements(By.XPATH,'//*[@id="livenews-id-1-202301282620082087"]')

3、模拟鼠标操作、模拟键盘操作

操作函数
右击context_click()
双击double_click()
拖拽double_and_drop()
悬停move_to_element()
执行perform()
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
# 模拟鼠标
from selenium.webdriver.common.action_chains import ActionChains# Chrome浏览器
browser = webdriver.Chrome()browser.get("https://www.xx.com/")time.sleep(2)# 创建 ActionChains 对象
actions = ActionChains(browser)# 定位
element = browser.find_element(by=By.CLASS_NAME, value="dl_temp")# 悬停
actions.move_to_element(element).perform()# 模拟鼠标右键点击
actions.context_click(element).perform()time.sleep(2)# 模拟鼠标左键双击
double_click_element = browser.find_element(by=By.CLASS_NAME, value="dl_temp")
actions.double_click(double_click_element).perform()
time.sleep(2)## 模拟拖拽元素
# source_element = browser.find_element(By.ID, "source-id")
# target_element = browser.find_element(By.ID, "target-id")
# actions.drag_and_drop(source_element, target_element).perform()time.sleep(2)# 关闭浏览器
browser.quit()
move_to_element() 方法用于将鼠标移动到指定的 Web 元素上。
context_click() 方法用于模拟鼠标右键点击。
double_click() 方法用于模拟鼠标左键双击。
drag_and_drop() 方法用于模拟从一个元素到另一个元素的拖拽动作。

模拟键盘操作

# 创建 ActionChains 对象
actions = ActionChains(driver)# 查找输入框元素并发送文本
input_element = driver.find_element(By.ID, "input-id")
input_element.send_keys("Hello World")# 模拟按下回车键
input_element.send_keys(Keys.RETURN)# 模拟组合键(Ctrl + A)
actions.key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform()# 模拟组合键(Ctrl + C)复制
actions.key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()# 移动到另一个输入框并粘贴(Ctrl + V)
another_input_element = driver.find_element(By.ID, "another-input-id")
another_input_element.click()
actions.key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform()

pip install pyautogui
from selenium.webdriver.common.keys import Keys
操作函数
删除键send_keys(Keys.BACK_SPACE)
空格键send_keys(Keys.SPACE)
制表键send_keys(Keys.TAB)
回退键send_keys(Keys.ESCAPE)
回车send_keys(Keys.ENTER)
全选send_keys(Keys.CONTRL,‘a’)
复制send_keys(Keys.CONTRL,‘c’)
剪切send_keys(Keys.CONTRL,‘x’)
粘贴send_keys(Keys.CONTRL,‘x’)
键盘F1send_keys(Keys.F1)
import pyautogui
import time# 等待3秒,以便你有时间切换到想要输入的应用程序窗口
time.sleep(3)# 输入字符串
pyautogui.write('Hello World', interval=0.1)  # interval参数设置每个字符之间的间隔时间# 模拟按下回车键
pyautogui.press('enter')# 模拟组合键(Ctrl + A)
pyautogui.hotkey('ctrl', 'a')# 模拟组合键(Ctrl + C)复制
pyautogui.hotkey('ctrl', 'c')# 模拟组合键(Ctrl + V)粘贴
pyautogui.hotkey('ctrl', 'v')

4、延时等待

强制等待:就很简单了,直接time.sleep(n)强制等待n秒

隐式等待:implicitly_wait()设置等待时间,如果到时间有元素节点没有加载出来,就会抛出异常

显式等待:

5、对Cookie操作

# 启动浏览器驱动,这里以 Chrome 为例
driver = webdriver.Chrome()# 打开目标网站
driver.get('https://xxxxx.com')# 添加一个Cookie到当前页面会话中
cookie = {'name': 'example_cookie', 'value': 'example_value'}
driver.add_cookie(cookie)# 访问另一个页面或刷新当前页面以使新添加的Cookie生效
driver.refresh()
# 获取所有Cookies  集合
all_cookies = driver.get_cookies()# 获取特定名称的Cookie 也就是
# next() 函数用于从生成器中获取下一个项。如果生成器中有匹配的项,next() 将返回第一个满足条件的 Cookie 对象;如果没有找到任何匹配项,那么第二个参数 None 就会被返回,作为默认值。
specific_cookie = next((c for c in all_cookies if c['name'] == 'example_cookie'), None)
# 删除特定名称的Cookie
driver.delete_cookie('example_cookie')# 删除所有Cookies
driver.delete_all_cookies()

6、execute_script方法

def is_element_exist(browser,xpath):try:element=browser.find_element(by=By.XPATH,value=xpath)flag=Trueexcept:flag=Falsereturn flag
x = 1000
y = 1000while True:# 执行JavaScript来设置滚动位置js = "var q=document.getElementsByClassName('cdk-virtual-scroll-viewport')[0].scrollTop={}".format(x)# 允许你在当前浏览器会话中执行任意的 JavaScript 代码browser.execute_script(js)  # 修正拼写错误time.sleep(0.5)  # 等待页面加载新内容x += y# 获取当前滚动高度check_height = browser.execute_script("return document.getElementsByClassName('cdk-virtual-scroll-viewport')[0].scrollTop;")# 如果滚动高度没有变化,说明已经到达底部或没有更多可加载的内容if check_height == temp_height:  # 修正比较运算符breaktemp_height = check_height  # 更新临时高度
# 需要定位的元素是动态元素,或者我们不确定它在哪时,可以先找到这个元素然后再使用JS操作# 要查找的 HTML 元素的 id 属性值
target = driver.find_element_by_id('id')# arguments[0]:这是 execute_script 方法的第一个额外参数(即 target)
driver.execute_script("arguments[0].scrollIntoView();", target)
参数 "arguments[0].scrollIntoView();":这是一个 JavaScript 语句,调用了 scrollIntoView() 方法。arguments[0] 是一个特殊的数组,包含了传递给 execute_script 方法的所有额外参数,在这里它引用了 target WebElement。参数 target:这是传递给 execute_script 方法的第二个参数,即前面找到的那个 WebElement 对象。execute_script 方法会将这个 WebElement 对象作为 arguments[0] 传递给 JavaScript 代码,从而使得 scrollIntoView() 方法作用于该元素。

7、xpath方法

表达式描述
nodename选取此节点的所有子节点(div)
/从根节点选取
//选择任意位置的某个节点
.选取当前节点
选取当前节点的父节点
@选取属性


通配符描述
*匹配任何元素节点
@*匹配任何属性节点
node()匹配任何类型节点
# 查找具有文本 "登录" 的按钮元素
//button[text()="登录"]# 模糊定位
//button[contains(text(),“登录”)]//button[contains(@class,“btn”)]
# id是以login-开头的
//input[starts-with(@id,“login-)]//input[ends-with(@id,“ogin-email”)]# 根据一个元素的多个属性进行定位 name和datatype是属性
//input[@name=“phone” and @datatype=“m”] 

轴定位

描述表达式
定位当前节点后的所有节点//标签名[@属性=属性值]/follow::标签名[@属性=属性值]
定位同一节点后的所有同级节点//标签名[@属性=属性值]/follow-sibling::标签名[@属性=属性值]
定位当前节点的所有子节点//标签名[@属性=属性值]/child::标签名[@属性=属性值]
定位当前节点前的所有节点//标签名[@属性=属性值]/preceding::标签名[@属性=属性值]
定位同一个节点前的所有同级节点//标签名[@属性=属性值]/preceding-sibling::标签名[@属性=属性值]
定位当前节点的所有父节点//标签名[@属性=属性值]/parent::标签名[@属性=属性值]
定位当前节点的所有祖父节点//标签名[@属性=属性值]/ancestor::标签名[@属性=属性值]
xpath='//span[text()=''/ancestor::div[3]/check-box]'
element=browser.find_element(by=By.XPATH,value=xpath)
//span[text()='']: 选择所有文本内容为空的<span>元素。
/ancestor::div[3]: 从选定的<span>元素向上查找其第三个祖先<div>元素。
/check-box: 从选定的第3个祖先<div>元素中选择<check-box>元素。

8、

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

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

相关文章

网络练级宝典-> UDP传输层协议

目录 传输层 端口号 端口号和进程的关系 UDP协议 UDP协议格式 UDP数据封装&#xff1a; UDP数据分用&#xff1a; 面向数据报 UDP的缓冲区 UDP的缺点 基于UDP的应用层协议 传输层 端口号 我们知道端口号对应的其实就是一个进程的pid&#xff0c;在操作系统中二者的…

Redis原理—1.Redis数据结构

大纲 1.Redis的数据结构 2.Redis的SDS 3.Redis的链表 4.Redis的字典 5.Redis的跳跃表 6.Redis的整数集合 7.Redis的压缩列表 8.Redis的对象 9.Redis对象的几个关键属性 10.Redis的单线程为什么这么快 11.Redis的典型应用场景和说明 12.Redis的相关命令说明 1.Redis…

【Vue3中Router使用】

Vue3中Router使用 1. 安装vue-router组件2. 建两个测试页面2.1 测试页面Home.vue2.2 测试页面Category.vue 3. 创建路由对象4. 在入口main.js中引入router把App.vue改成路由页面5. 测试5.1 关闭检查解决ESlint报错5.2 改文件名解决ESlint检查报错测试WebHashHistory 和WebHisto…

python拆分Excel文件

按Sheet拆分Excel 或 按照某一列的不同值拆分Excel。文档样式如下&#xff1a; 结果&#xff1a;红色是按照Sheet名拆出的&#xff0c;蓝色和橙色是某个Sheet按照某列的不同值拆分的。 代码&#xff1a; # -*- coding: utf-8 -*- """ 拆分excel文件——按照…

交易所 Level-2 历史行情数据自动化导入攻略

用户部署完 DolphinDB 后&#xff0c;需要将历史股票数据批量导入数据库&#xff0c;再进行数据查询、计算和分析等操作。DolphinDB 开发了 ExchData 模块&#xff0c;主要用于沪深交易所 Level-2 行情原始数据的自动化导入&#xff0c;目前已支持的数据源包括&#xff1a; 沪…

开源ISP介绍(2)————嵌入式Vitis搭建

Vivado搭建参考前一节Vivado基于IP核的视频处理框架搭建&#xff1a; 开源ISP介绍&#xff08;1&#xff09;——开源ISP的Vivado框架搭建-CSDN博客 导出Hardware 在vivado中导出Hardware文件&#xff0c;成功综合—实现—生成比特流后导出硬件.xsa文件。&#xff08;注意导…

109.【C语言】数据结构之二叉树层序遍历

目录 1.知识回顾 2.代码实现 准备工作 LevelOrder函数 代码框架 关键代码 3.执行结果 1.知识回顾 层序遍历参见106.【C语言】数据结构之二叉树的三种递归遍历方式文章 截取的部分内容 定义:按层的方式遍历(,设n为树的深度,h1-->h2-->h3-->...-->hn) 以下面…

安装部署PowerDNS--实现内网DNS解析

PDNS是PowerDNS的缩写&#xff0c;是一个开源的DNS服务器软件。PowerDNS具有高性能、灵活性和可扩展性&#xff0c;可用于搭建各种规模的DNS解析服务。它支持多种后端数据库&#xff08;如MySQL、PostgreSQL等&#xff09;&#xff0c;提供高度定制化的配置选项&#xff0c;并具…

13.在 Vue 3 中使用OpenLayers加载鹰眼控件示例教程

在 WebGIS 开发中&#xff0c;鹰眼控件 是一个常用的功能&#xff0c;它可以为用户提供当前地图位置的概览&#xff0c;帮助更好地定位和导航。在本文中&#xff0c;我们将基于 Vue 3 的 Composition API 和 OpenLayers&#xff0c;创建一个简单的鹰眼控件示例。 效果预览 在最…

Elasticsearch 单节点安全配置与用户认证

Elasticsearch 单节点安全配置与用户认证 安全扫描时发现了一个高危漏洞&#xff1a;Elasticsearch 未授权访问 。在使用 Elasticsearch 构建搜索引擎或处理大规模数据时&#xff0c;需要启用基本的安全功能来防止未经授权的访问。本文将通过简单的配置步骤&#xff0c;为单节…

使用C#基于ADO.NET编写MySQL的程序

MySQL 是一个领先的开源数据库管理系统。它是一个多用户、多线程的数据库管理系统。MySQL 在网络上特别流行。MySQL 数据库可在大多数重要的操作系统平台上使用。它可在 BSD Unix、Linux、Windows 或 Mac OS 上运行。MySQL 有两个版本&#xff1a;MySQL 服务器系统和 MySQL 嵌入…

计算机视觉与各个学科融合:探索新方向

目录 引言计算机视觉与其他学科的结合 与医学的结合与机械工程的结合与土木工程的结合与艺术与人文的结合发文的好处博雅知航的辅导服务 引言 计算机视觉作为人工智能领域的重要分支&#xff0c;正迅速发展并渗透到多个学科。通过与其他领域的结合&#xff0c;计算机视觉不仅…

SpringBoot期末知识点大全

一、学什么 IoC AOP&#xff1a;面向切面编程。 事物处理 整合MyBatis Spring框架思想&#xff01; 二、核心概念 问题&#xff1a;类之间互相调用/实现&#xff0c;导致代码耦合度高。 解决&#xff1a;使用对象时&#xff0c;程序中不主动new对象&#xff0c;转换为由外部提…

QT模型/视图:自定义代理类型

简介 在模型/视图结构中&#xff0c;代理的作用就是在视图组件进入编辑状态编辑某个项时&#xff0c;提供一个临时的编辑器用于数据编辑&#xff0c;编辑完成后再把数据提交给数据模型。例如&#xff0c;在 QTableView 组件上双击一个单元格时&#xff0c;代理会提供一个临时的…

ubuntu中使用ffmpeg库进行api调用开发

一般情况下&#xff0c;熟悉了ffmpeg的命令行操作&#xff0c;把他当成一个工具来进行编解码啥的问题不大&#xff0c;不过如果要把功能集成进自己的软件中&#xff0c;还是要调用ffmpeg的api才行。 ffmpeg的源码和外带的模块有点太多了&#xff0c;直接用官网别人编译好的库就…

实现 DataGridView 下拉列表功能(C# WinForms)

本文介绍如何在 WinForms 中使用 DataGridViewComboBoxColumn 实现下拉列表功能&#xff0c;并通过事件响应来处理用户的选择。以下是实现步骤和示例代码。 1. 效果展示 该程序的主要功能是展示如何在 DataGridView 中插入下拉列表&#xff0c;并在选择某一项时触发事件。 2.…

Docker Compose实战一( 轻松部署 Nginx)

通过过前面的文章&#xff08;Docker Compose基础语法&#xff09;你已经掌握基本语法和常用指令认识到Docker Compose作为一款强大工具的重要性&#xff0c;它极大地简化了多容器Docker应用程序的部署与管理流程。本文将详细介绍如何使用 Docker Compose 部署 Nginx&#xff0…

【免费】如何考取HarmonyOS应用开发者基础认证和高级认证(详细教程)

HarmonyOS应用开发者认证考试PC网址 基础&#xff1a;华为开发者学堂 高级&#xff1a;华为开发者学堂 注&#xff1a;免费认证&#xff0c;其中基础认证有免费的课程&#xff0c;浏览器用Edge。 (新题库有点懒&#xff0c;不更新了&#xff0c;点赞收藏后找我要新题库 2024…

瑞芯微开发板 烧写固件问题

自用rk3568-firefly-itx-3568q核心板fpga自研底板&#xff0c;因底板所需外设、功能与原厂有较大差异&#xff0c;故裁剪相应sdk&#xff0c;编译新的内核进行烧写。然而在更改设备树过程中kernel/drivers/media/i2c/fpga.c中的像素格式MEDIA_BUS_FMT_YUYV8_2X8误改成MEDIA_BUS…

photoblog解题过程

本题要求&#xff1a;通过sql注入&#xff0c;找到数据库中的账号密码&#xff0c;并成功登录。登录后利用文件上传&#xff0c;将一句话木马上传到数据库中&#xff0c;然后并对网站进行控制。 解题过程 1、通过在靶机中输入ifconfig&#xff0c;查到ip为192.168.80.153&…