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’) # 键盘事件

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

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

相关文章

使用css 与 js 两种方式实现导航栏吸顶效果

position的属性我们一般认为有 position:absolute postion: relative position:static position:fixed position:inherit; position:initial; position:unset; 但是我最近发现了一个定位position:sticky 这个可以称为粘性定位。 这个粘性定位的元素会始终在那个位置 <st…

rust cfg的使用

前提是一个crate倒入另一个crate。 先看结构 test_lib目录结构 这与另一个crate处于同一个目录,所以另一crate倒入的时候在Cargo.toml中使用如下语句。 test_lib = {path = "../test_lib" }先在test_lib/src/abc/abc.rs中添加没有cfg的两个函数做测试。 pub fn…

虹科方案丨自动驾驶多传感器数据融合方法

文章来源&#xff1a;雅名特自动驾驶 点此阅读原文&#xff1a;https://mp.weixin.qq.com/s/QsPMWZDGZaPdEx47L2VmeA 近年来&#xff0c;深度学习技术在涉及高维非结构化数据领域展现出了最先进的性能&#xff0c;如计算机视觉、语音、自然语言处理等方面&#xff0c;并且开始涉…

Django实战项目-学习任务系统-用户登录

第一步&#xff1a;先创建一个Django应用程序框架代码 1&#xff0c;先创建一个Django项目 django-admin startproject mysite将创建一个目录&#xff0c;其布局如下&#xff1a;mysite/manage.pymysite/__init__.pysettings.pyurls.pyasgi.pywsgi.py 2&#xff0c;再创建一个…

智能视频分析系统AI智能分析网关V3触发告警图片不显示该如何解决?

AI智能分析网关V3包含有20多种算法&#xff0c;包括人脸、人体、车辆、车牌、行为分析、烟火、入侵、聚集、安全帽、反光衣等等&#xff0c;可应用在安全生产、通用园区、智慧食安、智慧城管、智慧煤矿等场景中。将网关硬件结合我们的视频监控系统EasyCVR一起使用&#xff0c;可…

Android免杀小结

目录 msfvenom 自动生成 自带免杀 工具免杀 Thefatrat backdoor-apk old-fatrat msfVenom嵌入式方法 venom 工具小记 加壳 源码免杀 加壳 源码混淆 数据通信 启动和运行方式修改 对抗反编译 反编译工具崩溃 ZIP文件格式对抗 ZIP通用位伪加密 AndroidManife…

MySQL 面试知识脑图 初高级知识点

脑图下载地址&#xff1a;https://mm.edrawsoft.cn/mobile-share/index.html?uuid18b10870122586-src&share_type1 sql_mode 基本语法及校验规则 ONLY_FULL_GROUP_BY 对于GROUP BY聚合操作&#xff0c;如果在SELECT中的列&#xff0c;没有在GROUP BY中出现&#xff…

网络初识(JAVA EE)

文章目录 一、网络发展史二、网络通信基础三、协议分层四、封装和分用 一、网络发展史 独立模式&#xff1a;计算机之间相互独立&#xff0c;每个终端都各自持有客户数据&#xff0c;且当处理一个业务时&#xff0c;按照业务流程进行 网络互连&#xff1a;将多台计算机连接在一…

如何退出commit_message页面

虽然提示命令了&#xff0c;但我试了&#xff0c;退不出去。我没搞明白。。。 退出编辑 Crtl Z设置git的编辑器为vim或vi git config --global core.editor vim如果没有vim编辑器&#xff0c;设置成vi编辑器也行 git config --global core.editor vi重新提交 再次进入commi…

【HTML5】语义化标签记录

前言 防止一个页面中全部都是div&#xff0c;或者ul li&#xff0c;在html5推出了很多语义化标签 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 常用语义化案例 一般我用的多的是header&#xff0c;main&#xff0c;footer 这些标签不难理解&#x…

怎么通过Fiddler对APP进行抓包?以及高级应用场景分析

前言 我们经常需要用到Fiddler做代理服务器对Web、APP应用进行抓包&#xff0c;以便我们对接口功能进行测试调试&#xff0c;定位问题等。这篇将讲述怎么通过Fiddler对APP进行抓包&#xff0c;以及简单介绍一些高级应用场景。 首先&#xff0c;附上Fiddler使用的环境配置清单…

MidJourney | AI绘画也有艺术

免费绘画&#xff0c;体验更多AI可关&注公&众&号&#xff1a;AI研究工厂

华测监测预警系统 2.2 存在任意文件读取漏洞

华测监测预警系统 2.2 存在任意文件读取漏洞 一、 华测监测预警系统 2.2 简介二、漏洞描述三、影响版本四、fofa查询语句五、漏洞复现1、手动复现2、自动复现 六、修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信…

暴涨100万粉仅用一个月,B站内容趋势前线洞察

- 导语 在这个9月&#xff0c;B站涌现多位黑马UP主&#xff0c;有的UP主自入驻B站以来&#xff0c;一个月的时间就涨粉百万晋升为头部UP主&#xff0c;有的UP主因内容受到B站百万年轻人的追捧&#xff0c;展现账号爆发力。 接下来&#xff0c;飞瓜数据&#xff08;B站版&…

LCD1602驱动开发

目录 一、LCD1602简介 二、LCD1602的电路原理图 三、1602的引脚定义 四、通信协议 操作步骤: 五、LCD1602关键性的指令设置 1.清屏指令 2.进入模式设置指令 3.显示开关控制指令 4.功能设定指令 六、写入数据操作 1、地址的计算 2、RAM地址映射图 七、LCD1602函数驱…

基于DeOldify的给黑白照片、视频上色

老照片常常因为当时的技术限制而只有黑白版本。然而现代的 AI 技术&#xff0c;如 DeOldify&#xff0c;可以让这些照片重现色彩。 本教程将详细介绍如何使用 DeOldify 来给老照片上色。 文章目录 准备工作执行代码图片上色视频上色 总结 准备工作 这里用 git clone 命令克隆…

Windows下Mosquitto服务配置监听任何IP,搭配使用MQTTX

Mosquitto 默认只监听本地地址&#xff0c;想让它监听其他的IP和端口需要以下操作在mosquitto.conf文件最后加如下内容 allow_anonymous true listener 1883 0.0.0.0 在启动的时候只需要 .\mosquitto.exe -c .\mosquitto.conf -v 就可以了

数据库Mysql三大引擎(InnoDB、MyISAM、 Memory)与逻辑架构

MySQL数据库及其分支版本主要的存储引擎有InnoDB、MyISAM、 Memory等。简单地理解&#xff0c;存储引擎就是指表的类型以及表在计算机上的存储方式。存储引擎的概念是MySQL的特色&#xff0c;使用的是一个可插拔存储引擎架构&#xff0c;能够在运行的时候动态加载或者卸载这些存…

cuML机器学习GPU库

目录 一、开始安装 1、创建虚拟环境 2、激活该虚拟环境 3、安装cuML 4、安装ipykernel 5、在jupter上使用&#xff0c;所以需要配置一下新的内核 二、调试 1、原始机器学习库运行 2、cuml库运行 以下安装教程为基于Linux系统&#xff0c;cuda版本为11.3.109、驱动530.…

阶段六-Day03-MyBatis

一、框架介绍 1. 框架的作用 将许多项目封装起来,形成了框架 2. 框架的优缺点 1. 优点 1.1 更好用 框架都是对Java原生内容进行的封装&#xff0c;对于企业级项目开发来说&#xff0c;使用框架比使用原生Java更好用&#xff0c;写起来更简单。 1.2 更强大 框架封装过程…