当前位置: 首页 > 知识库问答 >
问题:

Python Selenium Webdriver-动态更改代理设置

邓宜年
2023-03-14

我目前正在成功地使用下面的代码将代理与Selenium webdriver一起使用。不幸的是,我似乎无法让它在不重新启动整个浏览器的情况下更改代理设置。我曾希望简单地更新代理设置,就像我在开始设置代理时所做的那样,可以更改代理,但它似乎不起作用。在此问题上的任何帮助都将不胜感激。

profile = webdriver.FirefoxProfile()
profile.set_preference("network.proxy.type", 1)
profile.set_preference("network.proxy.http", proxyAddress)
profile.set_preference("network.proxy.http_port", proxyPort)
profile.update_preferences()
driver = webdriver.Firefox(firefox_profile=profile)

共有3个答案

蓝华皓
2023-03-14

要使用Chrome动态更改代理(使用selenium 3.141.0,关键点是驱动程序。启动会话(cap)):

   proxy = get_new_proxy()     # x.x.x.x:y
   
   c = {
       "proxyType": "MANUAL",
       "httpProxy": proxy,
       "sslProxy": proxy
   }
   
   cap = webdriver.DesiredCapabilities.CHROME.copy()
   cap['proxy'] = c
   driver.start_session(cap)
   try:
       b.get('https://whatismyip.com')
   except Exception as e:
       print(e)

p、 硒。网络驱动程序。常见的代理代理<指定代理时也可以使用代码>添加到功能()(因此您不需要使用上面的cdict。)

孟均
2023-03-14

要使用Firefox动态设置代理,请执行以下操作:

def set_proxy(driver, http_addr='', http_port=0, ssl_addr='', ssl_port=0, socks_addr='', socks_port=0):

    driver.execute("SET_CONTEXT", {"context": "chrome"})

    try:
        driver.execute_script("""
          Services.prefs.setIntPref('network.proxy.type', 1);
          Services.prefs.setCharPref("network.proxy.http", arguments[0]);
          Services.prefs.setIntPref("network.proxy.http_port", arguments[1]);
          Services.prefs.setCharPref("network.proxy.ssl", arguments[2]);
          Services.prefs.setIntPref("network.proxy.ssl_port", arguments[3]);
          Services.prefs.setCharPref('network.proxy.socks', arguments[4]);
          Services.prefs.setIntPref('network.proxy.socks_port', arguments[5]);
          """, http_addr, http_port, ssl_addr, ssl_port, socks_addr, socks_port)

    finally:
        driver.execute("SET_CONTEXT", {"context": "content"})

使用方法:

 driver = webdriver.Firefox()

 set_proxy(driver, http_addr="212.35.56.21", http_port=8080)

 driver.get("http://....")

 set_proxy(driver, http_addr="212.35.56.22", http_port=8888)

 driver.get("http://....")
龙德润
2023-03-14

这是一个略显陈旧的问题。但是实际上可以通过一种“黑客的方式”动态改变代理,我将在火狐上使用硒JS,但是你可以用你想要的语言跟随。

步骤1:访问“about:config”

driver.get("about:config");

步骤2:运行更改代理的脚本

var setupScript=`var prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);

prefs.setIntPref("network.proxy.type", 1);
prefs.setCharPref("network.proxy.http", "${proxyUsed.host}");
prefs.setIntPref("network.proxy.http_port", "${proxyUsed.port}");
prefs.setCharPref("network.proxy.ssl", "${proxyUsed.host}");
prefs.setIntPref("network.proxy.ssl_port", "${proxyUsed.port}");
prefs.setCharPref("network.proxy.ftp", "${proxyUsed.host}");
prefs.setIntPref("network.proxy.ftp_port", "${proxyUsed.port}");
                  `;    

//running script below  
driver.executeScript(setupScript);

//sleep for 1 sec
driver.sleep(1000);

其中use${abcd}是放置变量的地方,在上面的示例中,我使用的是ES6,它处理连接,如图所示,您可以使用您选择的其他连接方法,具体取决于您的语言。(SetupScript是一个字符串,包含要运行的脚本,用“`”括起来)

步骤3:访问您的站点

driver.get("https://whatismyip.com");

说明:上面的代码利用Firefox的API使用JavaScript代码更改首选项。

 类似资料:
  • 向最终用户提供一份货币清单。他们可以在任何时候选择他们感兴趣的一个。因此,需要根据所选货币更改中使用的区域设置。这似乎不是微不足道的。 是否有一种方法可以根据在运行时动态提供的货币代码来确定区域设置?

  • 我必须动态更改代理的边框颜色。代理在显示屏上显示为默认圆圈。显示的颜色必须根据代理类中定义的布尔变量进行更改。第一次创建并显示代理时,它的样式正确,但当代理类中的boolen变量更改时,边框颜色不会更改。如果我对代理的填充颜色也做同样的处理,效果会很好。我把我使用的代码放在这里: 创建代理并将其添加到上下文时,它会采用正确的颜色,但如果更改,则边框颜色不会更改。我也尝试过同样的方法导入接口,但问题

  • 问题内容: 我目前正在成功使用以下代码在Selenium Webdriver中使用代理。不幸的是,如果不重新启动整个浏览器,我似乎无法使其更改代理设置。我曾希望仅更新代理服务器设置(就像我将代理服务器设置为开始那样)会更改代理服务器,但似乎不起作用。在这个问题上的任何帮助将不胜感激。 问题答案: 这是一个有点老的问题。但是实际上有可能通过“ hacky way ” 动态地更改代理,我将在 Fire

  • 问题内容: 我正在从数据库中成功获取数据值。我也将它们存储到一个数组中。我需要将String数组作为项的加载,以响应执行的关键操作。每当获取按键值时,如何获取按键值,就如何重新加载项目。相反,我需要动态刷新项目。 问题答案:

  • 本文向大家介绍浅谈Java代理(jdk静态代理、动态代理和cglib动态代理),包括了浅谈Java代理(jdk静态代理、动态代理和cglib动态代理)的使用技巧和注意事项,需要的朋友参考一下 一、代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强。加入一些非业务性代码,比如事务、日志、报警发邮件等操作。 二、jdk静态代理 1、业务接口 2、业务实现类 3、代理类

  • 问题内容: 我正在以编程方式/动态方式创建原型bean。我希望启动后的这些bean在jmx控制台中。我如何区分它们?我正在使用注释以便将我的bean添加到jmx中, 我需要动态注入objectName。知道我该怎么办吗? 这是我的jmx配置: 问题答案: 您可以使用JMX命名策略来执行此操作。在工作中,我们使用一个接口: 我已经发布了实现RuntimeMetadataNamingStrategy命