• selenium firefox FirefoxProfile不生效


    替代方案

    使用python + selenium 启动firefox时,偶然发现通过FirefoxProfile的set_preference方法来更改firefox的配置没有生效,后续追了下源码发现通过set_preference方法修改的配置值若是webdriver_prefs.json中的配置值,那么在后续webdriver启动的时候又会被其他方法通过再次读取默认配置的方式替换掉,导致配置不生效。

    若想配置生效可以使用如下方式进行:

    firefox_profile = FirefoxProfile()
    FirefoxProfile.DEFAULT_PREFERENCES['frozen'].update({'browser.link.open_newwindow':3})
    
    • 1
    • 2

    在这里插入图片描述
    在初始化对象后,直接修改类的公共属性DEFAULT_PREFERENCES,这样在后续webdriver加载配置文件属性时会直接读取DEFAULT_PREFERENCES中的值,从而达到修改配置的目的。当然如果不想这样做,也可以直接去修改webdriver_prefs.json中的对应值。

    具体DEFAULT_PREFERENCES中能修改的值可以参考每次启动后在temp目录下生成的prefs.js文件或selenium库下web driver/firefox/webdriver_prefs.json
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    配置不生效原因

    接下来从源码方面看 为什么配置会不生效。

    首先来看调用方面
    在这里插入图片描述
    调用方式就如图所示,创建FirefoxProfile然后在创建driver的时候将profile对象传入。

    然后让我们来看看在这期间set_preference()方法和webdriver.Firefox()方法都做了什么,导致配置被覆盖。
    在这里插入图片描述
    在这里插入图片描述
    可以看到在profile初始化的时候实际上就是去读的FirefoxProfile这个文件同目录下的webdriver_prefs.json文件,读取后将值给到类的公共属性DEFAULT_PREFERENCES中,然后再深拷贝一部分值到self.default_preferences属性上,而profile对象的set_preference()方法就是去修改的self.default_preferences的属性,所以暂时来看set_preference()方法是没有什么问题的,那么问题出在哪里呢?

    我们在set_preference()下面会看到另一个方法 update_preferences()
    在这里插入图片描述
    发现这个方法会读取公共属性DEFAULT_PREFERENCES中的frozen列表中的所有键值对然后再把值全部给到self.default_preferences。显然如果在调用了set_preference()方法将frozen列表中的值改了后再调用了update_preferences()方法那么之前的修改就被覆盖无法生效了。那么是不是这么一回事呢?

    接下来我们逐步的检查初始化方法webdriver.firefox()

    firefox init方法
    在这里插入图片描述
    在这里插入图片描述
    一路调用就破案了

  • 相关阅读:
    云计算中的关键技术——虚拟化
    排查内存泄露
    MySQL进阶(数据库引擎)——MyISAM和InnoDB引擎的区别
    【思考总结】数列收敛和级数收敛的联系与区别【概念辨析】
    Git——IDEA集成GitHub详细操作
    图论05-【无权无向】-图的广度优先BFS遍历-路径问题/检测环/二分图/最短路径问题
    YoloV:视频中目标实时检测依然很棒(附源代码下载)
    revit中如何实现【管线编辑】?
    java毕业生设计药房药品采购集中管理系统计算机源码+系统+mysql+调试部署+lw
    Save POJO to MongoDB
  • 原文地址:https://blog.csdn.net/wcyyyyyyy/article/details/127646413