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")
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在使用Selenium打开火狐浏览器时,需要使用独立的火狐驱动geckodriver。在早期的版本中,火狐浏览器内嵌了与Selenium通讯的驱动,因此不需要额外下载geckodriver。可以通过导入webdriver包,并初始化一个火狐浏览器实例来实现。比如,在Python中可以使用以下代码: ``` from selenium import webdriver driver = webdriver.Firefox() driver.maximize_window() driver.get("https://www.baidu.com") driver.quit() ``` 这段代码将打开一个火狐浏览器实例,最大化浏览器窗口,然后打开百度网站,最后关闭并退出浏览器。但是在版本47.0.1之后的火狐浏览器中,内嵌的驱动被移除了,所以需要安装独立的火狐驱动geckodriver,并将其路径添加到系统环境变量中,以便Selenium能够正确地与之通讯。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [使用Selenium启动火狐浏览器](https://blog.csdn.net/yoyocat915/article/details/80493890)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Python+Selenium基础篇之2-打开和关闭火狐浏览器](https://blog.csdn.net/asmartkiller/article/details/115472497)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值