selenium连接已打开的Firefox浏览器_selenium控制已经打开的火狐-程序员宅基地

技术标签: python  selenium  firefox  自动化  

原理:将session_idurl进行记录,下次打开firefox浏览器进行复用

import os,pickle,json,win32api
from selenium import webdriver
from selenium.webdriver import Remote
from selenium.webdriver.chrome import options
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.remote.webdriver import WebDriver as remoteWebdriver
from pathlib import Path

import logging as log
log.basicConfig(level=log.INFO)

command_executor_key = "command_executor"
session_id_key = "session_id"


class ReuseBrowser(Remote):
    def __init__(self, command_executor, session_id):
        self.r_session_id = session_id
        Remote.__init__(self, command_executor=command_executor, desired_capabilities={
    })

    def start_session(self, capabilities, browser_profile=None):
        """
        启用已有session_id
        start_session方法重写(去除selenium库Remote类每次实例化都会调用start_session这个方法新建一个会话)
        """
        if not isinstance(capabilities, dict):
            raise InvalidArgumentException("Capabilities must be a dictionary")
        if browser_profile:
            if "moz:firefoxOptions" in capabilities:
                capabilities["moz:firefoxOptions"]["profile"] = browser_profile.encoded
            else:
                capabilities.update({
    'firefox_profile': browser_profile.encoded})

        self.capabilities = options.Options().to_capabilities()
        self.session_id = self.r_session_id
        self.w3c = False

def get_firefox_info_path():
    """获得firefox信息存储路径"""
    temp_path = os.getenv('TEMP')
    log.info("temp path:%s" % temp_path)
    selenium_path = Path(temp_path).joinpath("selenium")
    if not selenium_path.exists():
        selenium_path.mkdir(parents=True, exist_ok=True)
    return str(selenium_path.joinpath("selenium_firefox_info.json").resolve())

def close_firefox():
    """
    关闭firefox浏览器
    @return:
    """
    os.system("TASKKILL /F /IM firefox.exe /T")
    os.system("TASKKILL /F /IM geckodriver.exe /T")

def start_geckodriver(driver_path):
    """打开geckodriver驱动"""
    log.info("start driver_path:%s" % driver_path)
    win32api.ShellExecute(0,"open",driver_path,None,None,0)

class Firefox():
    def __init__(self,firefox_path, driver_path,command_executor=None,option=None,capabilities=None):
        self.firefox_path = firefox_path
        self.driver_path = driver_path
        if not command_executor:
            command_executor = "127.0.0.1:4444"
        self.command_executor = command_executor
        if not capabilities:
            capabilities = DesiredCapabilities.FIREFOX
        self.capabilities = capabilities
        if not option:
            self.option = webdriver.FirefoxOptions()
        if self.firefox_path:
            self.option.binary = firefox_path
        #firefox信息存储路径
        self.get_firefox_info_path = get_firefox_info_path()
    
    def start_firefox(self):
        #关闭firefox浏览器和驱动
        close_firefox()
        #重新开启驱动
        start_geckodriver(self.driver_path)
        driver = remoteWebdriver(command_executor=self.command_executor,
                                                      desired_capabilities=self.capabilities,
                                                      options=self.option
                                                      ) 
        #写入
        firefox_info = {
    }
        firefox_info[session_id_key] = driver.session_id
        firefox_info[command_executor_key] = driver.command_executor._url
        log.info("session_id:%s" % driver.session_id)
        log.info("url:%s" % driver.command_executor._url)
        with open(self.get_firefox_info_path,"w") as write_f:
            json.dump(firefox_info,write_f,indent=4,ensure_ascii=False)
        self.driver = driver

    def resume(self):
        #获得firefox信息存储路径
        info_path = Path(self.get_firefox_info_path)
        if info_path.exists():
            # 路径存在
            # 读取信息
            with open(str(info_path),"r") as load_file:
                try:
                    load_dict = json.load(load_file)
                    session_id = load_dict[session_id_key]
                    command_executor = load_dict[command_executor_key]
                    log.info("...load info...")
                    log.info("session_id:%s" % session_id)
                    log.info("command_executor:%s" % command_executor)
                    self.driver = ReuseBrowser(command_executor,session_id)
                    self.driver.refresh()
                except:
                    log.info("存储信息有误,重新打开FireFox")
                    self.start_firefox()
        else:
            #路径不存在
            self.start_firefox()

调用

if __name__ == "__main__":
    firefox_path = r"C:\Program Files\Mozilla Firefox\firefox.exe"
    driver_path = r"D:\gitee\selenium_template\cw_rpa\driver\geckodriver.exe"
    firefox = Firefox(firefox_path, driver_path)
    firefox.resume()
    driver = firefox.driver
    driver.get("http://www.baidu.com")
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012399690/article/details/128332523

智能推荐

Cas单点登录+oauth2第三方授权要点记录_cas4集成oauth认证-程序员宅基地

文章浏览阅读1.7k次。Cas单点登录+oauth2第三方授权总结需求:由于系统需要同时支持第三方登录和单点登录,而旧代码的业务逻辑繁琐,难以修改,单点登录有问题。所以对cas和oauth2模块进行了重构。在本次开发过程中,cas工程不依赖于ouath2,先从cas构建开始总结。Cas工程的构建依赖于cas-overlay-template进行。该工程中集成了cas-server,使用该覆盖模板,我们可以在不..._cas4集成oauth认证

yarn : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行 脚本。-程序员宅基地

文章浏览阅读517次。最近在安装yarn的时候,突然给我报了这个错,试了好久才发现是这个问题yarn : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行 脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Po licies。所在位置 行:1 字符: 1+ yarn+ ~~~~已解决:报错是因为没有权限,只需要指_yarn : 无法加载文件 c:\users\administrator\appdata\roaming\npm\yarn.ps1,因为

解决Linux下pycharm无法输入中文的问题_linux中的pycharm无法打中文-程序员宅基地

文章浏览阅读6k次,点赞5次,收藏12次。本方法测试于Manjaro 18.1.5,理论上使用于所有Arch Linux或其他Linux发行版。并且也应该使用于idea等其他jetbraints IDE。问题描述虽然pycharm、idea等IDE官方只有英文版,但其实它们也会读取系统的地区和语言设置,并因此而导致了一些字体显示,文字输入之类的问题。在我的系统中,虽然我已经把中文设置为的默认语言、显示语言,但是不知道Manjaro抽..._linux中的pycharm无法打中文

CSDN Markdown 图片排版与缩放显示_csdn图片并列排版代码-程序员宅基地

文章浏览阅读5.2k次,点赞7次,收藏8次。CSDN Markdown 图片排版与缩放显示_csdn图片并列排版代码

在线下载离线地图瓦片 (支持百度、高德和谷歌地图)_高德地图瓦片下载-程序员宅基地

文章浏览阅读1.3w次。制作离线地图,下载百度矢量数据制作3D地图,下载离线地图数据,下载离线地图瓦片。支持三个主流地图数据(百度、高德和谷歌)。下载网址:http://wmksj.com/1. 点击“地图下载”菜单。2. 百度地图支持下载图片瓦片、个性地图瓦片和矢量地图。主题地图瓦片下载3. 谷歌地图支持普通地图瓦片和卫星瓦片。卫星地图瓦片4. 高德地图支持普通地图瓦片和卫星地图瓦片。高德卫星地图瓦片..._高德地图瓦片下载

使用拟合方法实现光敏电阻传感器数值与光照强度的近似转换_光敏电阻ad转换为光照强度-程序员宅基地

文章浏览阅读9k次,点赞21次,收藏75次。这次来分享一次突发奇想的经历。文章主要是要实现将ADC模块获取的光敏电阻数值转换成标准单位勒克斯的光照强度,虽然说由于实验方法和实验环境,最终结果并不是很准确,但也算是一次不错的体验。目录一、前言(无关技术的废话,可以跳过)二、具体实现思路三、实验设备和环境1.软件2.硬件一、前言(无关技术的废话,可以跳过)最近在项目搞STM32和光敏电阻传感器,辛辛苦苦地找了厂家客服和很多资料,发现都没有光敏电阻阻值或者电压转换成光照强度的公式。百度了一下,发现我还是太高估了光敏电阻的精确度了,大多数光敏电阻._光敏电阻ad转换为光照强度

随便推点

jdbc操作数据库的curd_jdbc创建图书表的curd-程序员宅基地

文章浏览阅读197次。//1,编写程序,在程序中加载数据库驱动 Class.forName("com.mysql.jdbc.Driver") ; //2,建立连接(Connection) String url="jdbc:mysql://localhost:3306/test1"; String user="root"; String password="123456"; Connection conn = ..._jdbc创建图书表的curd

猿人学17题-天杀的http2.0_http20adapter authority-程序员宅基地

文章浏览阅读851次。前言:我们来了解一下http2.0,http2.0是为了加快网页渲染速度所发布的新的协议,我们之前使用的request只能够get请求到http1.0的数据而http2.0就没有办法了,所以为了爬取http2.0的数据,我们需要了解一个第三方库hyper来帮助我们获取数据,有了hyperlpr库在手,抓取数据简直轻轻松松。hyper使用文档http协议版本在这里查看1.安装hyperlpr库pip install hyper -i https://pypi.douban.com.._http20adapter authority

RecyclerView跳转到指定位置_recyclerview分类跳转-程序员宅基地

文章浏览阅读3.3k次。自从android5.0推出RecyclerView以后,RecyclerView越来越受广大程序员的热爱了!大家都知道RecyclerView的出现目的是为了替代listview和ScrollView在列表方面的使用!那么listview和ScrollView的所有功能和方法都应该有的!但是RecyclerView的很多方法,不是封装在RecyclerView中的,当我们在RecyclerV..._recyclerview分类跳转

使用mondo制作自己的Centos7系统镜像_mondo resource制作centos镜像-程序员宅基地

文章浏览阅读1.1k次。经过很多个版本测试后,如果要制作centos7的ISO镜像,centos7要使用2003版本,其他的个人测试都失败了,下面的流程均按照centos7-2003-64位版本介绍(曾随便下了一个centos6,忘记哪个版本了,也是可以的)第一步准备好你的centos7环境,想搞成什么样子,准备好第二步首先切换到/etc/yum.repos.d/目录下,然后下载mondo的源cd /etc/yum.repos.d/wget ftp://ftp.mondorescue.org/rhel/7/x86__mondo resource制作centos镜像

windows编译QCefView_qcefview编译-程序员宅基地

文章浏览阅读2.5k次。1.下载QCefView源码GitHub原项目地址:https://github.com/tishion/QCefView由于原地址服务器在国外,因此我下载是非常的慢,经常down失败,于是我尝试了另一个博主的国内git地址:https://gitee.com/yuanfeng1897/QCefView ,但是这个地址没有和github上的保持实时同步更新,而且我最终用的时候有bug,先不管这..._qcefview编译

潮汐观测数据调和分析及预报成图_潮汐数据分析-程序员宅基地

文章浏览阅读6.8k次,点赞9次,收藏60次。首先,需要说明两点。第一,本案例使用的是单月潮汐观测数据,处理方法则是基于长期观测资料的调和分析来进行处理。中期观测资料的分析需要分别求主要分潮、随从分潮,短期观测资料分析则还需要计算不同观测序列的权重,但是核心算法与长期观测资料分析是一致的,都是建立矛盾方程,然后使用最小二乘法建立法方程,求出法方程系数,再求出矩阵X、Y。第二,本文主要介绍方法步骤,所用代码大多为关键步骤实现,仅供参考。下面开始介绍本案例的处理,从理论上讲,首先,我们需要选取分潮,确立我们所要分析的天文分潮,本案例用8个主要分潮——_潮汐数据分析

推荐文章

热门文章

相关标签