python 的selenium自动操控浏览器教程(2)

news2024/9/21 12:39:14

人生苦短,我用py


文章目录

  • 人生苦短,我用py
    • 关于部分网页无法找到元素的问题1
      • 方案1
      • 方案2
    • 关于部分网页无法找到元素的问题2
      • 解决方案
    • 被网站检查出来我们使用了selenium了怎么办?
    • 如何实现前进后退
    • 当使用py删除文件时报禁止访问怎么办
    • 怎么使用py实现解压文件?
    • 怎么打开系统的图片应用向用户展示图片?
    • 怎么去下载网络资源?
    • 怎么获取当前路径?
    • 怎么使用Webderive截图?
    • JSON数据的天坑?
  • 通用代码分享
  • 如何截长图?


关于部分网页无法找到元素的问题1

问题描述
这个问题我想,大概还是基础知识不牢靠的原因

selenium中的寻找元素,只是能寻找到当前页面的一个html中的元素,如果出现嵌套的网页就无法寻找到所嵌套网站中的元素的!!对我说的就是iframe!!!这个自带黑魔法的东西

上图:
在这里插入图片描述

出现这种情况是找不到的!

方案1

我们需要先获取iframe中的src也就是嵌套网页的地址,然后再去请求就好了

# 寻找第一层框架入口
s = Driver.find_element(By.ID, "frame_content").get_attribute("src")
# 进入第一层框架入口
Driver.get(s)

方案2

当然我们页可以直接去对iframe执行点击操作,这样更快,更人性化

关于部分网页无法找到元素的问题2

问题描述
这种情况是出现打开新的网页的情况,当我们打开了新的页面时,但是我们WebDriver并不会自动跳转的!他还在原来的页面时,所以我们去寻找新页面中的元素就会找不到了!!

如图所示

在这里插入图片描述

解决方案

那怎么样让驱动也去跳转那?

那我们需要获取句柄了(我只会windows平台上的)

注意这是我们获取的时当前驱动的所有句柄,如果有两个页面的话就会有两个句柄的,于是我们取出最后也个句柄,并使用switch_to.window方法使我们的浏览器驱动跳转到我们需要的(及第二个)页面。

  # 获取当前句柄,这很重要!!
   url = Driver.window_handles
   # 跳转到我们需要的网页
   Driver.switch_to.window(url[1])

被网站检查出来我们使用了selenium了怎么办?

问题描述
现在自动化工具越来越火了,一些厂商就针对与自动化工具做了限制,如:如果加了无头模式

一些网站的js就会检测出来,使我们的操作失效

解决方法
直接看代码吧,这玩意不好解释

    # 创建option对象
    options = Options()
    # 设置无头模式即浏览器不弹出,只在后台运行
    options.add_argument("headless")
    # 解决部分网站的对于Selenium的js监测机制,
    # 以下2行
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
    options.add_experimental_option('useAutomationExtension', False)
    # 加载浏览器驱动
    Webdriver = Service(driverfilename)
    # 加载驱动和无头
    driver = webdriver.Edge(service=Webdriver, options=options)
    # 解决部分网站的对于Selenium的js监测机制,
    # 以下1行
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",
                           {'source': 'Object.defineProperty(navigator,"webdriver",{get:()=>undefind})'})

如何实现前进后退

前进及不用说了,直接请求即可了,但是怎么去实现后退那?

上代码,这么少?哈哈其实坑多着哩!这个后退只能实现一个,也就是说如果连续写多个back()就会失效的!所以说该用driver.current_url去获取网址时就多用,不要去懒省事的

                # 回到上一个页面
                Driver.back()
                # 获取当前url
                driver.current_url

当使用py删除文件时报禁止访问怎么办

不要慌不要慌,这种情况多出现在删除文件夹时这时我们就需要去使用shutil这个模块了,它可以保保证删除文件夹时不出错,但是用它去删除文件时却会出错的,要牢记

import shutil
if os.path.exists(name1):
    shutil.rmtree(name1)
if os.path.exists(name):
    os.remove(name)

怎么使用py实现解压文件?

我们使用zipfile模块,去实现首先打开文件 使用extratall()就可以实现解压了

import zipfile
        # 文件解压
        with zipfile.ZipFile(name) as zf:
            zf.extractall()
        print("解压完成")

注意:解压完成是会自动删除源文件的

怎么打开系统的图片应用向用户展示图片?

注意这里好像只支持win系统

代码

def showimg(path):
    userPlatform = platform.system()  # 获取操作系统
    if userPlatform == 'Windows':  # Mac
        os.startfile(path)
    else:
        print("暂且不支持您的操作系统")

效果展示
在这里插入图片描述

怎么去下载网络资源?

下载网络资源

        dow = requests.get(downloadurl, headers)
        open("drive.zip", "wb").write(dow.content)

下载网页
使用的是py自带的标准库,不需要去下载第3方库

urllib.request.urlretrieve("URL路径","保存路径")

怎么获取当前路径?

一句

os.getcwd()

怎么使用Webderive截图?

Driver.save_screenshot(path)

JSON数据的天坑?

当我们去使用xhr,窃取响应时,通常会使用post请求,但是请注意,这里post 请求中的参数

1 必须是双引号
2 就算是数字也必须加上引号
3 没有值的话就加空字符串
4 布尔值必须是小写的true/false

请注意第2条,如果不加引号,js会把它按照int32类型处理但是当创出int32的范围时就会请求失败,这就是为什么int类型的数据也要加引号的 原因

1、传统表单post请求(xhr的请求)

import requests
url = “https://tests”
data = {“key”:“value”}
res = requests.post(url=url,data=data)
print(res.text)

2、json类型的post请求
import requests
url = “https://tests”
data = ‘{“key”:“value”}’
#字符串格式
res = requests.post(url=url,data=data)
print(res.text)
**
最后的一些未解决的问题
我们使用selenium获取到的cooike不全怎么办?
怎么根据快捷方式找到源文件的位置?
恳请大佬们解答**

通用代码分享

import platform
import os
import sys
import zipfile
import shutil
import requests
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
from win32com.client import Dispatch


# 初始化Drvier
def init(driverfilename, isHeadless):
    print("开始浏览器初始化\n")
    # 创建option对象
    options = Options()
    if isHeadless:
        # 设置无头模式即浏览器不弹出,只在后台运行
        options.add_argument("headless")
    # 解决部分网站的对于Selenium的js监测机制,
    # 以下2行
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
    options.add_experimental_option('useAutomationExtension', False)
    # 加载浏览器驱动
    Webdriver = Service(driverfilename)
    # 加载驱动和无头
    driver = webdriver.Edge(service=Webdriver, options=options)
    # 解决部分网站的对于Selenium的js监测机制,
    # 以下1行
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",
                           {'source': 'Object.defineProperty(navigator,"webdriver",{get:()=>undefind})'})
    print("浏览器初始化完成")

    return driver


# 获取当前浏览器的版本
def getversion(filename):
    parser = Dispatch("Scripting.FileSystemObject")
    version = parser.GetFileVersion(filename)
    print("当前Edge浏览器版本为:" + version)
    return version


# 获取浏览器的源路径
def getEdgePath():
    while True:
        print("""
        请输入您的Edge浏览器的源路径(不是快捷方式的路径)
        方法:
        1 找到桌面上的Edge浏览器,右击鼠标选择“打开文件位置”
        2 进入新打开的文件夹之后找到“msedge.exe”文件右击复制文件路径
        3 将刚刚复制的路径,复制过来即可
        """)
        path1 = input("")
        if path1 != "":
            return path1
        else:
            print("请输入Edge浏览器的源路径")


# 打开路径中的文件
def showFile(path):
    userPlatform = platform.system()  # 获取操作系统
    if userPlatform == 'Windows':  # Mac
        os.startfile(path)
    else:
        print("暂且不支持您的操作系统")


# 获取是否开启后台模式
def isHeadless():
    while True:
        isHeadless = input("是(Y)否(N)开启后台模式")
        if (isHeadless == "Y" or isHeadless == "N"):
            if isHeadless == "Y":
                return True
            else:
                return False
        else:
            print("请输入正确指令")


# 浏览器驱动下载
def downloadandZip(downloadurl, headers, name):
    try:
        print("正在下载驱动")
        dow = requests.get(downloadurl, headers)
        open("drive.zip", "wb").write(dow.content)
        print("驱动下载完成,正在解压")
        # 文件解压
        with zipfile.ZipFile(name) as zf:
            zf.extractall()
        print("解压完成")
        return True
    except:
        print("浏览器驱动下载失败")
        # 程序终止
        sys.exit()


# 获取下载的浏览器驱动的路径
# 同时:
# 1 删除无关文件
# 2 检测浏览器驱动是否受损
def startDownloadandZipexc(downloadurl, headers):
    name = "drive.zip"
    temp1 = "Driver_Notes"
    downloadandZip(downloadurl, headers, name)
    # 删除无关文件
    print("正在删除无关文件")
    drivername = "msedgedriver.exe"
    if os.path.exists(temp1):
        shutil.rmtree(temp1)
    if os.path.exists(name):
        os.remove(name)
    print("无关文件删除成功")
    if os.path.exists(drivername):
        return os.getcwd() + "\msedgedriver.exe"
    else:
        while True:
            t = input("浏览器驱动受损或被删除,是(Y)否(N)重新下载")
            if t == "Y" or t == "N":
                if t == "Y":
                    # 驱动下载
                    downloadandZip(downloadurl, headers, name)
                    return os.getcwd() + "\msedgedriver.exe"
                else:
                    print("正在退出")
                    return False


# 入口
if __name__ == "__main__":
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400'}
    print("欢迎使用xxx系统\n")
    # 获取浏览器的源路径
    path1 = getEdgePath()
    # 格式化路径
    path2 = path1.replace("\\", "//").replace("\"", "")
    # 获取浏览器版本
    oldversion = getversion(path2)
    # 浏览器驱动下载地址
    downloadurl = "https://msedgedriver.azureedge.net/" + oldversion + "/edgedriver_win64.zip"
    # 获取浏览器驱动的地址
    driverfilepath = startDownloadandZipexc(downloadurl, headers)
    if driverfilepath != False:
        print("浏览器驱动器路径为:" + driverfilepath + "不必要,请勿删除!!!")
        # 是否开启无头模式
        isHeadless = isHeadless()
        # 初始化Driver
        Driver = init(driverfilepath, isHeadless)

如何截长图?

效果
在这里插入图片描述

不过请注意要实现截长图浏览器必须开启无头模式!!!!
不过请注意要实现截长图浏览器必须开启无头模式!!!!
不过请注意要实现截长图浏览器必须开启无头模式!!!!


        driver.get("https://blog.csdn.net/yutu75/article/details/115524985")
        # 用js获取页面的宽高,如果有其他需要用js的部分也可以用这个方法
        width = driver.execute_script("return document.documentElement.scrollWidth")

        height = driver.execute_script("return document.documentElement.scrollHeight")

        # 获取页面宽度及其宽度
        print(width, height)

        # 将浏览器的宽高设置成刚刚获取的宽高
        driver.set_window_size(width, height)

        time.sleep(1)

        # 截图并关掉浏览器
        driver.get_screenshot_as_file("xx.png")

        driver.quit()


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

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

相关文章

【服务器数据恢复】存储之间迁移数据时数据损坏的数据恢复案例

服务器数据恢复环境&故障: 一台某品牌的存储设备,Windows操作系统。由于业务需求,需要把这台存储设备中的数据迁移到另外一台存储设备中,在迁移数据过程中突然无法读取数据,管理界面报错。管理员查看服务器内的数据…

【Github的注册】

目录 一、打开官网 二、注册 1、点击右上角的 sign up 2、依次输入邮箱、密码、用户名 3、验证真人,create account,验证码 4、点击“个人“,“学生”,进入另一个页面后滚动鼠标直接点击continue,进入另一个页面后…

Yakit Web Fuzzer 终极能力强化:热加载 Fuzz

Background 在 HTB:BountyHunter 中,我们发现 Web Fuzzer 在使用中可以 “更强”,我们需要编写 Yak 脚本的事情,如果可以经过某些 Web Fuzzer 的优化,可以达到同样的效果。 在一个标签中,我们实现{{base6…

智慧工地火焰烟火识别检测 yolo

智慧工地火焰烟火识别检测算法通过yolo网络模型深度学习技术,智慧工地火焰烟火识别检测算法对现场浓烟和烟火情况,立即抓拍告警并进行存档。YOLO 的核心思想就是把目标检测转变成一个回归问题,利用整张图作为网络的输入,仅仅经过一…

图解LeetCode——2335. 装满杯子需要的最短总时长

一、题目 现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。 给你一个下标从 0 开始、长度为 3 的整数数组 amount ,其中 amount[0]、amount[1] 和 amount[2] 分别表示需要装满冷水、温…

【THREE.JS】网页中的炫酷3D

web3d一、前言粒子特效二维漫画可视化后期处理二、项目使用流程2.1 项目结构2.2 基本使用2.3 项目模板2.4 技术栈三、基础动画3.1 THREE.Clock3.2 GASP四、照相机8.1 正交相机8.2 透视相机4.3 相机控制器五、画布和全屏六、几何体七、Debug UI八、纹理贴图8.1 mipmapping8.2 放…

关于IcmpSendEcho2的使用和回调问题

由于我的需求是短时间内ping多台机子,所以需要异步执行,微软提供的例子是同步方式的,根据微软官方提供的icmpSendEcho2 函数的信息 ,我需要定义一个空的宏PIO_APC_ROUTINE_DEFINED ,定义完之后,编译又出现…

Java基础:回调函数

因为在看Android代码的时候发现了许多关于回调函数的知识, 所以去了解了一下. 对于我来说不太好懂, 因为我觉得看的那些博文的讲法对我来说很绕, 所以我在理解了之后想写一篇关于回调函数的博文来给和我一样理解能力稍差的人一点帮助. 回调函数的作用其实就是将需要这个功能的调…

【JavaGuide面试总结】Redis篇·中

【JavaGuide面试总结】Redis篇中1.Redis 单线程模型了解吗?2.Redis6.0 之后为何引入了多线程?3.Redis 是如何判断数据是否过期的呢?4.过期的数据的删除策略了解么?5.Redis 内存淘汰机制了解么?6.什么是 RDB 持久化&…

【Python+Appium】自动化测试框架

目录:导读 appium简介 设计思路 测试框架设计 测试框架目录结构 测试框架思维导图 测试结果展示 appium简介 Appium 是一个开源的、跨平台的测试框架,可以用来测试 Native App、混合应用、移动 Web 应用(H5 应用)等&#xf…

Spring之依赖注入源码解析

Spring之依赖注入源码解析 依赖注入原理流程图: https://www.processon.com/view/link/5f899fa5f346fb06e1d8f570 Spring 中有几种依赖注入的方式? 首先分为两种: 1、手动注入 2、自动注入 1、手动注入 在 XML 中定义 Bean 时&#xff0c…

Gartner 再度预测2023低代码趋势,真的会赚钱吗?

2023年,从业者对低代码的发展充满了想象,人们认为,未来低代码的商业价值不可估量。 此话并非空穴来风。据Gartner的最新报告显示,到2023年,超过70%的企业将采用低代码作为他们发展战略的关键目标之一;到202…

训练自己的中文word2vec(词向量)--skip-gram方法

训练自己的中文word2vec(词向量)–skip-gram方法 什么是词向量 ​ 将单词映射/嵌入(Embedding)到一个新的空间,形成词向量,以此来表示词的语义信息,在这个新的空间中,语义相同的单…

双塔多目标MVKE

MVKE:Mixture of Virtual-Kernel Experts for Multi-Objective User Profile Modeling MVKE论文中是给用户打tag标记,构建用户画像。使用的也是经典的双塔模型,另外在双塔的基础上面叠加了ctr和cvr的多个目标。但是论文最大的创新点是在用户…

基于龙芯 CPU 的气井控制器的软件设计(三)

4.1 系统软件的总体设计 基于龙芯 CPU 的气井控制器的设计需要开发测试硬件模块的测试软件,主要对 RTC 模块、存储器模块、4G 通信、以太网通信、UART 串口以及 AI 模块进行了驱动程序和 应用程序设计。将各个模块设计为不同的任务,龙芯 RTU 软件设计流程…

Redis 监听过期的key(KeyExpirationEventMessageListener)

目录一、简介二、maven依赖三、编码实现3.1、application.properties3.2、Redis配置类3.3、监听器3.4、服务类3.5、工具类四、测试4.1、测试类4.2、单实例4.3、多实例结语一、简介 本文今天主要是讲Redis中对过期key的监听,可能很多小伙伴不会,或者使用会…

day15_常用类

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、代码块[了解] 三、API 四、Object 五、包装类 六、数学和随机 零、 复习昨日 抽象接口修饰符abstractinterface是不是类类接口属性正常属性没…

Leetcode(每日一题)——1139. 最大的以 1 为边界的正方形

摘要 1139. 最大的以 1 为边界的正方形 一、以1为边界的最大正方形 1.1 动态规划 第530题需要正方形所有网格中的数字都是1,只要搞懂动态规划的原理,代码就非常简洁。而这题只要正方形4条边的网格都是1即可,中间是什么数字不用管。 这题…

Hive的安装与配置

一、配置Hadoop环境先看看伪分布式下的集群环境有没有错误的情况:输入命令:start-all.sh jps查看伪分布式的所有进程是否完善二、解压并配置HiveHive压缩包→ https://pan.baidu.com/s/1eOF_ICZV8rV-CEh3nX-7Xw 提取码: m31e 复制这段内容后打开百度网盘…

逆向 xx音乐 aversionid

逆向 xx音乐 aversionid 版本 7.2.0 版本 7.22.0 第一步,charles 抓包 目标字段 aversionid 加固平台 com.stub.StubApp 360加固s.h.e.l.l.S 爱加密com.secneo.apkwrapper.ApplicationWrapper 梆梆加固com.tencent.StubShell.TxAppEntry 腾讯加固 第二步&…