使用selenium操作时,每次使用webdriver.Firefox()都要重新弹出火狐窗口,效率非常低,所以我一直在查,selenium能不能在已打开的浏览器上操作,发现该模块没有这个功能,那说明只能自己来了,百度了很久,只觉得这位老哥@wwwqjpcom的有帮助,那就在他研究的基础上改进下吧!原网址https://blog.csdn.net/wwwqjpcom/article/details/51232302

他的python思路是:

1.先手动打开geckodriver.exe

2.运行本体的类WebDriver,设定好url跟选定firefox,启动浏览器,然后把id跟url保存在data文件内

3.然后在另外一个py文件内获取data内的id跟url,启动自己写的myWebDriver上对已启动浏览器操作,这样就不需要再开启一个浏览器这么费劲了!!

经过测试,完全可以!

但是太特么费劲,居然还得手动运行geckodriver,还得分2个程序,不符合python的优雅性,所以我想着能不能把原selenium代码琢磨透,写出更优美的呢!!

日他奶奶个锤子,实力不够!看代码看得头晕,例如说RemoteConnection这是什么方法?是在这个文件的吗,怎么找不到,原来是从另外的文件导入的,那么再到那个文件去看,又看到一个函数,这个文件也没有啊!奶奶个锤子,又是别的文件导入,头发都挠得快没了,就像一条河,很多支流汇入,然后这些支流也有很多小溪,源头也有很多,最后都汇进了这条大河,方便是方便,好看是好看,但是回查会很痛苦,想搞懂一个方法的用途,真的很折腾,得全部吃透才行。如果pycharm能有什么功能快速回查、或者显示其方法的用途(例子会更好),这样就能很高效率的弄懂他人所写的模块了!

==================================================

回到正题,在专研简化的过程中,session_url跟session_id确实如原博主所说,这就是selenium的关键,只要在启动的程序中替换了webdriver随机产生的id跟url,就不需要重新开启一个浏览器了,而geckodriver.exe就是关键,想要通过selenium启动firefox,就得靠这个程序。

默认的webdriver.Firefox()运行时,先是启动gecko,打开火狐浏览器,代码运行结束后,gecko也跟着关闭。我试着把代码延时,在另外的py文件中运行原博主的myfirefox,发现可以在该浏览器操作,所以想要有这个效果,那么gecko就得持续开着!

所以此时思路有2个,一是修改firefox()代码,让gecko不关闭,但是追踪了下,原来gecko的启动在另外的文件,如果要修改,会非常麻烦,而且怕影响其他程序,所以只能采取第二种了

那就是整个selenium最核心的webdriver了——webdriver.remote.webdriver.WebDriver(),也就是原博主使用的那个,用它来启动浏览器,而且还得持续开着geckodriver.exe,然后用myfirefox在启动了的火狐浏览器操作。

说几点要注意的:

1.运行程序中没有geckodrive,myfirefox会报错

2.有了geckodriver,但是没有火狐没启动,或者不是对应的ID、url,还是报错

3.用webdriver启动的浏览器,第一个窗口不能关!!!!关了就出错,可能第一个窗口就是对应的ID

好了,那么现在再梳理梳理,具体操作如下

·   当geckodriver.exe没运行,那就先启动,然后调用WebDriver(),     启动浏览器,然后把ID跟URL保存在data文件内

·   那么geckodriver.exe运行,而火狐不在,那么能用WebDriver() 吗?或者是myFirefox? 都不行,会显示错误Message: Session is already started !! 那么Firefox() 呢?肯定行!但有个卵蛋用,不能在它上面操作啊!

所以解决方法就是把已经存在的geckodriver.exe结束程序,然后运行第一步!

·   除了上面的情况,还有可能已经打开的火狐跟geckodriver不是对应的,或者手抖把第一个窗口给关了,那么使用myFirefox 都会报错,所以我使用了try,一旦不行,那么就结束程序,重新打开浏览器

要点

1  使用初始webdriver启动火狐浏览器

2  使用原博主自编的myfirefox 在原浏览器操作

3  pickle 保存字典

4  使用win32api模块 打开程序

5 使用psutil模块检测后台程序,关闭程序

import os,pickle, psutil,win32api,logging
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver import myFirefoxclass myfox():
    '''目的:不需要每次都重新打开浏览器'''
    def __init__(self):
        self.file=r'C:\Users\Administrator\AppData\Roaming\Python\Python35\site-packages\selenium\webdriver\firefox\params.data'
        self.gecko=r'C:\Users\Administrator\AppData\Local\Programs\Python\Python35\Scripts\geckodriver.exe'
        self.url="http://127.0.0.1:4444"
        self.capabilities=DesiredCapabilities.FIREFOX  #实际就是选定firefox浏览器

    def creatfirefox(self):
        '''先运行geckodriver,启动浏览器,记录IDURL,返回driver'''
        win32api.ShellExecute(0, 'open', self.gecko, '', '', 0)  # 先在后台运行geckodriver
        driver = webdriver.remote.webdriver.WebDriver(command_executor=self.url,desired_capabilities=self.capabilities,)params={}params["session_id"] = driver.session_idparams["server_url"] = driver.command_executor._urlwith open(self.file,'wb') as f:
            pickle.dump(params, f)return driverdef work(self):
        '''先判断geckodriver启动没有,没启动就直接运行,启动了先try,不行就删除geckodriver,再次运行friefox'''
        p_name = [psutil.Process(i).name() for i in psutil.pids()]#罗列进程的程序,如果gecko没有,直接创建启动
        if 'geckodriver.exe' not in p_name:
            driver=self.creatfirefox()else:
            try: #已经有gecko了,试试能不能在旧的浏览器上执行myfirefox(有可能对应的浏览器已经关闭了)
                with open(self.file, 'rb') as f:
                    params = pickle.load(f)driver = myFirefox.myWebDriver(service_url=params["server_url"], session_id=params["session_id"])driver.refresh()except Exception as e:
                #当不能直接在旧浏览器上操作时,那就删了gecko重新再运行
                logging.error('浏览器跟geckodriver不对应!!\n%s'% e)[p.kill() for p in psutil.process_iter() if p.name() == 'geckodriver.exe']#os.system("taskkill /F /IM geckodriver.exe") 这种方法会有乱码!!
                driver = self.creatfirefox()return driverdriver=myfox().work()
driver.get('http://www.baidu.com/')

这是原博主的myfirefox

try:
  import http.client as http_client
  except ImportError:
  import httplib as http_client
  import socket
  from selenium.webdriver.firefox.webdriver import WebDriver as Firefox
  from selenium.webdriver.firefox.remote_connection import FirefoxRemoteConnection
  from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
  from selenium.webdriver.remote.remote_connection import RemoteConnection
  from selenium.webdriver.remote.errorhandler import ErrorHandler
  from selenium.webdriver.remote.switch_to import SwitchTo
  from selenium.webdriver.remote.mobile import Mobile
  from selenium.webdriver.remote.file_detector import FileDetector, LocalFileDetector
  from selenium.webdriver.remote.command import Command
   
  class myWebDriver(Firefox):
  def __init__(self, capabilities=None, service_url=None, session_id=None):
  if service_url is None and session_id is None:
  raise NameError
   
  if capabilities is None:
  capabilities = DesiredCapabilities.FIREFOX.copy()
   
  self.capabilities = dict(capabilities)
   
  self.w3c = True
   
  executor = FirefoxRemoteConnection(remote_server_addr=service_url)
  self.session_id=session_id
  self.command_executor = executor
  self.command_executor.w3c = self.w3c
  if type(self.command_executor) is bytes or isinstance(self.command_executor, str):
  self.command_executor = RemoteConnection(self.command_executor, keep_alive=True)
  self._is_remote = True
  self.error_handler = ErrorHandler()
  self._switch_to = SwitchTo(self)
  self._mobile = Mobile(self)
  self.file_detector = LocalFileDetector()
  def quit(self):
  """Quits the driver and close every associated window."""
  try:
  self.execute(Command.QUIT)
  except (http_client.BadStatusLine, socket.error):
  # Happens if Firefox shutsdown before we've read the response from
  # the socket.
  pass

实际操作

这时因为已经关了火狐,只留下geckodriver没关

成功打开了!!!

然后在这基础上操作

打开百度,搜索python

成功了!!收工!

python selenium+firefox 使用已打开的火狐浏览器进行操作(不需要每次都重新打开火狐)相关推荐

  1. Python+Selenium+Firefox配置,及可以启动浏览器,不能自动输入地址

    今天用Python做之前的项目时,发现火狐可以启动,但是不能自动输入网址 从头到尾检查完了发现不行,最后检查火狐版本的时候发现丫给我自动升级了,给我气的,浪费了一个小时时间,所以记录下来,大家尽快找到 ...

  2. python控制已经打开的浏览器_使用python+selenium控制手工已打开的浏览器

    我们可以利用Chrome DevTools协议.它允许客户检查和调试Chrome浏览器. 打开cmd,在命令行中输入命令: chrome.exe --remote-debugging-port=922 ...

  3. Python+selenium 自动化-读取excel记录的脚本执行登陆操作实战演示

    我们可以用 excel 来记录自动化,然后读取 excel 来执行命令,excel 可以很方便直观的管理我们录入的自动化.下面给大家演示一下 Python+selenium 自动化的实例,读取 exc ...

  4. 火狐浏览器更新版本之后总是在当前页面打开新链接覆盖掉原先内容

    火狐浏览器更新版本之后总是在当前页面打开新链接覆盖掉原先内容 自从火狐浏览器更新版本之后,我发现新版本中总是把新链接地址或者书签地址等在当前页面打开,覆盖掉原先页面内容,很不方便.(备注:本人浏览器版 ...

  5. python+selenium+chrome 做滑动验证码 会被浏览器检测到使用的自动软件导致滑动验证失败

    python+selenium+chrome 做滑动验证码 会被浏览器检测到使用的自动软件导致滑动验证失败 解决方法:代码中添加: import time from selenium import w ...

  6. Python+selenium+firefox模拟登录微博并爬取数据(1

    1:环境python3.5,最新 firefox,selenium-3.14.0. 本来准备用无界面的,但是感觉效果不好看出来所以先用有界面的浏览器来做.分几次来慢慢写.这节先配置好环境. 2:安装: ...

  7. python selenium+Firefox 模拟浏览器操作

    glumer Python安装selenium,配置火狐浏览器环境 火狐浏览器直接从网上下载即可, geckodriver的下载链接:https://github.com/mozilla/geckod ...

  8. Python+Selenium+Firefox headless 配置

    最近爬虫要用到Python爬一个比较复杂的网站,PhantomJs好像停止维护了,所以选择了Selenium+Firefox headless,查了一些Firefox相关的配置,记录一下 查看支持的配 ...

  9. Windows下利用python+selenium+firefox爬取动态网页数据(爬取东方财富网指数行情数据)

    由于之前用urlib和request发现只能获取静态网页数据,目前爬取动态网页有两种方法, (1)分析页面请求 (2)Selenium模拟浏览器行为(霸王硬上弓),本文讲的就是此方法 一.安装sele ...

最新文章

  1. SSM项目的数据库密码加密方案
  2. matlab 林智仁,机器学习:林智仁libsvm 工具箱 在matlab下的应用总结
  3. is属性用法 vue_Vue中is属性的用法 可以动态切换组件
  4. 关于mysql中GROUP_CONCAT函数的使用
  5. 201671030111 李蓉 实验十四 团队项目评审课程学习总结
  6. ironpython不想要可以卸载吗_IronPython的致命弱点
  7. Slam中几种变换的理解
  8. PHP tcp短链接,示例:建立TCP链接
  9. 读Java面向对象编程(孙卫琴)
  10. 在学校报名了计算机一级考试时间,2020年山东计算机一级报名及考试时间
  11. 不要重启!诺顿居然将系统文件当病毒
  12. SQL中ALTER TABLE 语句
  13. 《编程珠玑》读解 一
  14. 短视频运营方法分享,三个方面要注意,合理运营才能吸粉引流
  15. 《上瘾:让用户养成使用习惯的四大产品逻辑》读书笔记
  16. 知乎App加密流量分析初探
  17. 团队协作一、onlyoffice协同开发使用
  18. (二)UPF之电压域、低功耗模式编码(Primary Supply Set、Power State)
  19. Linux编译命令 make -j8 的意义
  20. 西门子s7-1200程序与威纶触摸屏画面实例

热门文章

  1. 前端前端开发工程师_我们庞大的工程师团队会使用此前端开发指南
  2. 电脑如何修改关闭显示器和休眠时间
  3. 812计算机专业排名,新鲜出炉2019年美国大学计算机工程专业排名榜单 麻省位居首位!...
  4. 赴日技术签证全攻略!
  5. 意想不到的前端三个小妙招
  6. 改变elementui卡片crad样式_Ueditor文字和echarts图片 生成 word 前端解决方案
  7. python入门第三课(初中生学Python)
  8. 关于android接入微信分享(以及app签名 the apk for your currently selected variant(app-release)
  9. 完全支持双层PDF!开源的PDF分离与合并软件,C#版本(转自codeproject)
  10. 庄帅:托管分销与物流集成战略雏形