• 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方法
    在这里插入图片描述
    在这里插入图片描述
    一路调用就破案了

  • 相关阅读:
    笙默考试管理系统-MyExamTest----codemirror(39)
    Redis(一)入门:NoSQL OR SQL,看完这篇你就懂了
    【软件测试】自动化测试selenium(一)
    python笔记(15)函数
    MySQL锁机制详解-表锁与行锁
    【技术分享】计算机视觉常见的十种图像标注方法
    做自媒体视频二次剪辑,怎样剪辑不算侵权
    需要电脑文字配音工具的快看过来
    nSoftware IPWorks 2022 Java 22.0.8 Crack
    GO 集合 map 使用总结
  • 原文地址:https://blog.csdn.net/wcyyyyyyy/article/details/127646413