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})

在这里插入图片描述
在初始化对象后,直接修改类的公共属性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方法
在这里插入图片描述
在这里插入图片描述
一路调用就破案了

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值