当前位置: 首页 > news >正文

10.selenium进阶

文章目录

    • 1、嵌套网页
      • 1、1 什么是嵌套页面
      • 1、2 selenium获取嵌套页面的数据
    • 2、执行JavaScript代码
    • 3、鼠标动作链
    • 4、selenium键盘事件
    • 5、其他方法
      • 5、1 选择下拉框
      • 5、2 弹窗的处理
    • 6、selenium设置无头模式
    • 7、selenium应对检测
    • 小结

1、嵌套网页

​ 在前端开发中如果有这么一个需求。一个页面上的内容要被其它页面所共用。也就是说两个或者两个以上的页面需要共同存在与同一个页面。在前端页面开发中可以把写好的代码在每个页面中都复制粘贴一份,但一是增加了代码的体积,二是不好进行维护。
​ 一个页面上的内容要被其它页面所共用,虽然你可以把写好的代码在每个页面中都复制粘贴一份,但一是增加了代码的体积,二是不好进行维护。
​ 所以,更好的做法是把其它页面在需要时引入进来。比如我的H5页面头和底都是固定的,以此先做一个主页面。当用户在点击不同的链接或按钮后,把其它一个或多个页面嵌套在主页面中就可以解决前面提到的问题。

1、1 什么是嵌套页面

​ 嵌套页面就是在一个HTML页面中嵌套了子页面,常见的网页嵌套的形式在HTML中对应的是标签。

嵌套页面图解:

在这里插入图片描述

嵌套页面在HTML源代码的表现形式:

在这里插入图片描述

在我们使用selenium操作此类网页的时候一定需要注意你所操作的页面是不是在嵌套页面。

1、2 selenium获取嵌套页面的数据

​ 使用selenium获取嵌套页面的数据,首先我们一定要进入到嵌套页面里面,不然是获取不到数据的。进入嵌套页面可以使用实例化浏览器对象的 switch_to.frame() 方法。此方法有两种实现方式,如下所示:

  • 根据索引值进入嵌套页面
  • 根据标签进入嵌套页面

案例:

from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get('https://music.163.com/#/song?id=1450083773')"""进图嵌套网页的方式有两种"""
driver.switch_to.frame(0)
print(driver.page_source)iframe = driver.find_element(By.CSS_SELECTOR, '#g_iframe')
driver.switch_to.frame(iframe)
print(driver.page_source)input()
driver.quit()

2、执行JavaScript代码

​ 在使用selenium操作网页时,有的网页需要滚动鼠标滚轮下拉页面,才会给我们加载页面的下部分数据。众所周知 JavaScript 可以直接在浏览器中运行,那么这样的操作可以让selenium执行JavaScript代码来完成。方法如下:

  • execute_script(‘js代码’):

    from selenium import webdriver
    import timedriver = webdriver.Chrome()
    driver.get('https://www.douban.com/')js = 'document.documentElement.scrollTop=2000'
    js_all = 'document.documentElement.scrollTop = document.documentElement.scrollHeight'driver.execute_script(js_all)input()
    driver.quit()
    

    注意:对于含有的嵌套网页也需要先嵌套网页才可以下拉。

3、鼠标动作链

​ 有些时候,需要在页面上模拟一些鼠标操作,比如双击、右击、拖拽甚至按住不动等,可以通过导入 ActionChains 类来做到:http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable
比如:

"""
拖动鼠标:ActionChains:ActionChains() --> 直接传入driver --> ActionChains(driver) 实例化perform --> 执行动作drag_and_drop(source, target) source拖动的元素 target元素被放置的位置
"""
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains  # 导入鼠标动作链功能driver = webdriver.Chrome()
driver.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')driver.switch_to.frame(0)drag = driver.find_element(By.CSS_SELECTOR, '#draggable')
drop = driver.find_element(By.CSS_SELECTOR, '#droppable')action = ActionChains(driver)action.drag_and_drop(drag, drop)action.perform()input()
driver.quit()
"""
注意:perform才是真正的执行 可以在perform之前定义多个动作 最后一起执行注意切入框内
"""

鼠标操作有如下的方法:

  • click()
    单击指定的元素。如果没有,则单击当前鼠标位置。
  • click_and_hold()
    按住元素上的鼠标左键,并保持。
  • context_click()
    对元素执行上下文单击(右键单击)
  • double_click()
    双击一个元素

4、selenium键盘事件

​ 除了上述的selenium操作之外,键盘事件也是非常重要的,比如我们需要按回车键,ctrl+c复制等等操作,都离不开键盘事件,在selenium中,提供了Keys方法来供我们操作键盘。

首先必须先引用selenium中keys包:

from selenium.webdriver.common.keys import Keys

Key()类几乎提供所有按键的方法:

引用方法对应键盘
send_keys(Keys.BACK_SPACE)删除键(BackSpace)
send_keys(Keys.SPACE)空格键(Space)
send_keys(Keys.TAB)制表键(Tab)
send_keys(Keys.ESCAPE)回退键(Esc)
send_keys(Keys.ENTER)回车键(Enter)
send_keys(Keys.CONTROL,‘a’)全选(Ctrl+A)
send_keys(Keys.CONTROL,‘c’)复制(Ctrl+C)
send_keys(Keys.CONTROL,‘x’)剪切(Ctrl+X)
send_keys(Keys.CONTROL,‘v’)粘贴(Ctrl+V)
send_keys(Keys.F1)键盘 F1
send_keys(Keys.F12)键盘 F12

需要注意的是键盘事件用send_keys()方法

而且selenium所有的send_keys()方法都是基于元素操作的,没有元素无法操作。

案例:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time# 在百度搜索框输入 python ,全选,复制,剪切,粘贴 跳转到搜狗输入框进行搜索
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')driver.find_element(By.CSS_SELECTOR, '#kw').send_keys('python')
time.sleep(3)driver.find_element(By.CSS_SELECTOR, '#kw').send_keys(Keys.CONTROL, 'a')  # 全选
time.sleep(3)driver.find_element(By.CSS_SELECTOR, '#kw').send_keys(Keys.CONTROL, 'c')  # 复制
time.sleep(3)driver.find_element(By.CSS_SELECTOR, '#kw').send_keys(Keys.CONTROL, 'x')  # 剪切
time.sleep(3)driver.get('https://www.sogou.com/')
driver.find_element(By.CSS_SELECTOR, '#query').send_keys(Keys.CONTROL, 'v')  # 粘贴
time.sleep(4)driver.find_element(By.CSS_SELECTOR, '#stb').send_keys(Keys.ENTER)input()
driver.quit()

5、其他方法

5、1 选择下拉框

​ 标签的下拉框。直接点击下拉框中的选项不一定可行。Selenium专门提供了Select类来处理下拉框。 其实 WebDriver 中提供了一个叫 Select 的方法,可以帮助完成这些事情。如下案例所示:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
import timedriver = webdriver.Chrome()
driver.get('https://www.jq22.com/demo/shengshiliandong/')
driver.implicitly_wait(10)element = driver.find_element(By.CSS_SELECTOR, '#s_province')select = Select(element)
time.sleep(3)"""选择下拉框的方法"""
# 根据索引取下拉框, 从1开始
select.select_by_index(1) 
time.sleep(3)# 根据下拉框的 value 取值
select.select_by_value('河北省') 
time.sleep(3)# 根据下拉框标签的文本取下拉框
select.select_by_visible_text('吉林省')  
time.sleep(3)input()
driver.quit()
'''
下拉框:Select(element) element是下拉框的元素选择的方法:1. select_by_value(value) value="天津市"2. select_by_index(1) 通过索引 1 2 3 4 5 63. select_by_visible_text(text) 通过可见的文本
'''

5、2 弹窗的处理

当你触发了某个事件之后,页面出现了弹窗提示,处理这个提示或者获取提示信息方法如下:

  • driver.switch_to_alert()
    切换到弹窗
  • accept()
    接受可用的弹窗,相当于点击“确认”
  • dismiss()
    解除可用的弹窗,相当于点击“取消”
  • text
    获取弹窗的文本
from selenium import webdriver
from selenium.webdriver import ActionChains 
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')driver.switch_to.frame(0)
drag = driver.find_element(By.CSS_SELECTOR, '#draggable')
drop = driver.find_element(By.CSS_SELECTOR, '#droppable')
action = ActionChains(driver)
action.drag_and_drop(drag, drop)
action.perform()# 处理弹窗
"""
switch_to_alert() 切换到弹窗
text 获取弹窗的文本
accept() 接受可用的弹窗,相当于点击“确认”
dismiss() 解除可用的弹窗,相当于点击“取消”
"""
alert = driver.switch_to.alert 
print(alert.text) 
# alert.accept() 
alert.dismiss() input()
driver.quit()

6、selenium设置无头模式

​ 总所周知,平时使用selenium做web自动化,运行代码的时候都会打开浏览器驱动访问界面。那么有没有什么方式可以实现无界面运行,让我们在调试代码的时候可以屏蔽界面,去做其他事情呢,答案是有的!

​ 在创建浏览器对象之前加上以下添加以下可选项,就能实现无界面运行了。

from selenium import webdriver
from selenium.webdriver.chrome.options import Optionschrome_options = Options()  # 声明一个谷歌配置对象
chrome_options.add_argument('--headless')  # 添加 无头模式 配置# 创建浏览器对象的时候添加配置
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://www.baidu.com')

7、selenium应对检测

​ selenium是用来完成浏览器自动化相关的操作。可以通过代码的形式制定一些基于浏览器自动化的相关操作(行为动作)。当代码执行后,浏览器就会自动触发相关的事件。

​ 但这并不能避免服务器的检测。当在浏览器中打开开发者工具输入window.navigator.webdriver时会显示true

说明被服务器检测到了,通常情况下会显示undefined。下面我们就通过对selenium进行设置,避免被检测。

  • Selenium执行cdp命令

    Chrome自带的开发者工具DevTools功能非常强大。基本上都是给浏览器开发人员用的工具。我们只需要学习用工具修改window.navigator.webdriver的值就可以了。

    • Selenium的WebDriver类中有一个execute_cdp_cmd(self, cmd, cmd_args)方法可以用来执行Chrome开发这个工具命令。

      driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""
      })
      

小结

  • 浏览器对象的方法及属性

    • driver.get(‘url’) 根据url地址访问站点
    • driver.page_source 查看页面渲染之后的html数据
    • driver.get_cookies() 查看页面请求后生成的cookies,可以用此方法拿到加密的cookies
    • driver.current_url 查看当前页面的url
    • driver.maximize_window() 最大化浏览器
    • driver.minimize_window() 最小化浏览器
    • driver.close() 关闭当前页面,注意不是关闭整个浏览器
    • driver.quit() 关闭浏览器
    • driver.implicitly_wait() 隐式等待
    • driver.back() 回退到上一级页面
    • driver.forward() 前进到下一级页面
    • driver.switch_to() 切换窗口
    • driver.switch_to.frame() 切换嵌套网页
    • driver.execute_script() 执行js
    • driver.switch_to_alert() 切换弹窗
  • 元素提取的方法及属性(提取多个标签用elements即可)

    • find_element_by_id # (根据id属性值获取元素)
    • find_element_by_name # (根据标签的name属性)
    • find_element_by_class_name #(根据类名获取元素)
    • find_element_by_link_text #(根据标签的文本获取元素,精确定位)
    • find_element_by_partial_link_text #(根据标签包含的文本获取元素,模糊定位)
    • find_element_by_tag_name #(根据标签名获取元素)
    • find_element_by_xpath #(根据xpath获取元素)
    • find_element_by_css_selector # (根据css选择器获取元素)
    • send_keys(‘需要在输入框输入的字符串’) # 向输入框输入数据
    • click() # 执行点击操作
    • text # 获取元素包含的文本内容
    • get_attribute(‘属性名’) # 获取元素的属性值
    • send_keys(Keys.CONTROL,‘a’) # 键盘事件

相关文章:

10.selenium进阶

文章目录 1、嵌套网页1、1 什么是嵌套页面1、2 selenium获取嵌套页面的数据 2、执行JavaScript代码3、鼠标动作链4、selenium键盘事件5、其他方法5、1 选择下拉框5、2 弹窗的处理 6、selenium设置无头模式7、selenium应对检测小结 1、嵌套网页 ​ 在前端开发中如果有这么一个需…...

【安全】 Java 过滤器 解决存储型xss攻击问题

文章目录 XSS简介什么是XSS?分类反射型存储型 XSS(cross site script)跨站脚本攻击攻击场景解决方案 XSS简介 跨站脚本( cross site script )为了避免与样式css(Cascading Style Sheets层叠样式表)混淆,所以简称为XSS。 XSS是一种经常出现在web应用中的计算机安全…...

一、Excel VBA 是个啥?

Excel VBA 从入门到出门一、Excel VBA 是个啥?二、Excel VBA 简单使用 👋Excel VBA 是个啥? ⚽️1. Excel 中的 VBA 是什么?⚽️2. 为什么 VBA 很重要?⚽️3. 是否有无代码方法可以在 Excel 中实现工作流程自动化&…...

Spring Boot读取配置文件

Spring Boot 是一种用于快速构建基于Spring的应用程序的框架,它提供了很多便利的功能和约定,使开发者可以快速搭建、配置和部署应用程序。在Spring Boot中,读取配置文件是一个非常常见的任务,本文将介绍如何在Spring Boot应用程序…...

spark集群环境下,实现人口平均年龄计算

文章目录 任务目标0. 版本信息1. 计算生成renkou.txt2. 文件上传至spark3. 上传文件时,可能出现的常见错误4. 编写spark文件5. 上传集群6. 集群环境下提交任务 任务目标 在虚拟机上部署spark集群,给定renkou.txt文件,输出平均年龄 renkou.t…...

[羊城杯 2020]black cat - 文件隐写+RCE(hash_hmac绕过)

[羊城杯 2020]black cat 1 解题流程1.1 第一步1.2 第二步1.3 第三步 1 解题流程 1.1 第一步 打开网站有首歌,按F12也是提示听歌,ctf-wscan扫描就flag.php下载歌,用010打开,发现有一段内容if(empty($_POST[Black-Cat-Sheriff]) |…...

智能文件管理助手,轻松实现按数量平均分类文件,高效整理新文件夹!

在我们的电脑或移动设备中,文件管理是我们日常工作和生活中不可或缺的一部分。有时候,我们可能需要将一个文件夹中的大量文件按照数量平均分配到多个新的文件夹中,以便更好地进行整理和管理。现在,我们为您提供了一款智能文件管理…...

安卓 Android 终端接入阿里云 IoT 物联网平台

在全球智能手机市场里,谷歌开发的安卓(Android)移动操作系统市场占有率已经高达90%。随着物联网智能硬件升级,安卓(Android)也逐渐成为智能摄像头,智能对讲门禁,人脸识别闸机,智能电视,智能广告屏等带屏 Io…...

2023自动化测试面试题(含答案)

1、你做了几年的测试、自动化测试,说一下 selenium 的原理是什么? 我做了五年的测试,1年的自动化测试; selenium 它是用 http 协议来连接 webdriver ,客户端可以使用 Java 或者 Python 各种编程语言来实现&#xff1…...

使用 Apache Camel 和 Quarkus 的微服务(一)

【squids.cn】 全网zui低价RDS,免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 ​Apache Camel 绝非Java企业技术栈领域的新手。它由James Strachan在2007年创建,旨在实现著名的 "EIP 书"(由Gregor Hohpe和Bobby W…...

如何通过高级流量管理提高 Kubernetes 的弹性

原文作者:Jenn Gile - F5 NGINX 产品营销经理 原文链接:如何通过高级流量管理提高 Kubernetes 的弹性 转载来源:NGINX 中文官网 NGINX 唯一中文官方社区 ,尽在 nginx.org.cn 编者按 —— 本文是以下系列博文中的一篇(…...

解决Springboot集成RabbitMQ不自动生成队列的问题

1.RabbitMQ消息的消费端服务 RabbitMQ懒加载模式, 需要配置消费者监听才会创建 RabbitListener(queues "test.queue")另外一种方式(若Mq中无相应名称的队列,会自动创建Queue),改为如下 RabbitListener(queuesToDeclare { Queue(value "test.queu…...

【数据结构】Decreasing String—CF1886C

Decreasing String—CF1886C 代码我现在还不是很理解&#xff0c;群友说是单调栈。 C o d e Code Code #include <bits/stdc.h> #define int long long #define sz(a) ((int)a.size()) #define all(a) a.begin(), a.end() using namespace std; using PII pair<int…...

【广州华锐互动】钢厂铸锻部VR沉浸式实训系统

随着科技的不断进步&#xff0c;虚拟现实(VR)技术已成为当今最具潜力的技术之一。在钢铁行业中&#xff0c;VR虚拟仿真实训已经被广泛应用于培训和教育领域&#xff0c;特别是钢铁厂铸锻部&#xff0c;通过VR技术&#xff0c;可以大大提高培训效率&#xff0c;降低培训成本&…...

Python中执行SQL报错unsupported format character ‘Y‘ (0x59) at index 34

Python中执行SQL报错unsupported format character ‘Y’ (0x59) at index 34 from sqlalchemy import create_engine engine_ts create_engine(mysqlpymysql://root:MySQL123456127.0.0.1:3306/dbmysql?charsetutf8&use_unicode1) sql "select date_format(t.tr…...

云数据库(林子雨慕课课程)

文章目录 6.云数据库6.1 云数据库概述6.2 云数据库产品6.3 UMP系统6.3.1 UMP系统概述6.3.2 UMP系统架构6.3.3 UMP系统功能 6.4 Amazon云数据库6.4.1 Amazon和云计算的渊源6.4.2 Amazon AWS6.4.3 AWS平台上的云数据库6.5 微软云数据库SQL Azure 6.云数据库 6.1 云数据库概述 云…...

2023-10-10 python-从一组颜色中找到与指定颜色最接近的颜色-{K-D树}-记录

摘要: 2023-10-10 python-从一组颜色中找到与指定颜色最接近的颜色-{K-D树}-记录 相关文档: 如何在颜色表中找到与当前颜色最接近的颜色&#xff1f; - 糯米PHP https://zh.wikipedia.org/wiki/%E6%9C%80%E9%82%BB%E8%BF%91%E6%90%9C%E7%B4%A2 https://zh.wikipedia.org/wiki/…...

使用C++实现DNS欺骗攻击

文章为花钱购买转载&#xff0c;但我测试并未成功&#xff01;&#xff01;&#xff01; 使用C实现DNS欺骗攻击-CSDN博客 使用C实现DNS欺骗攻击 DNS劫持是一种常见的网络攻击方式&#xff0c;通过篡改DNS响应数据&#xff0c;使得用户访问的网站被重定向到攻击者指定的恶意站…...

C#WPF属性元素语法应用实例

本文介绍C#WPF属性元素语法应用实例 一、属性元素语法 对于对象元素的某些属性,无法使用特性语法(比如:Background="Blue"),因为无法在特性语法的引号和字符串限制内充分地表达提供属性值所必需的对象或信息。 对于这些情况,可以使用另一个语法,即属性元素语…...

el-select应用虚拟列表,避免过多数据导致浏览器卡死

el-select&#xff1a; element-ui组件中的select下拉选择组件&#xff0c;支持单选、多选等 虚拟列表&#xff1a; 虚拟列表是一种优化技术&#xff0c;用于处理大型列表。在传统的列表中&#xff0c;当用户滚动到底部时&#xff0c;列表会加载所有的数据&#xff0c;这可能导…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

Django RBAC项目后端实战 - 03 DRF权限控制实现

项目背景 在上一篇文章中&#xff0c;我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统&#xff0c;为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...