搜索了好几个小时后,我开始认为这是不可能的。
我需要为每次运行使用不同的经过身份验证的(非公开的)代理来运行Chrome。
PROXY_IP = "<some IP address>"
UID = "<the user id>"
PWD = "<the password">
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=%s:%s@%s" % (UID,PWD,PROXY_IP))
driver = webdriver.Chrome(executable_path=".\\driver\\chromedriver.exe",
chrome_options=options)
driver.get("<site URL>")
Chrome会启动并显示错误:
This webpage is not available
ERR_NO_SUPPORTED_PROXIES
如果我使用公共代理不需要像这样的身份验证...
PROXY_IP = "<public proxy IP address>"
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=%s" % PROXY_IP)
driver = webdriver.Chrome(executable_path=".\\driver\\chromedriver.exe",
chrome_options=options)
driver.get("<site URL>")
...它运行得很好,并在使用代理时显示网站。
我还尝试在用户ID前面使用http://
的变体:
options.add_argument("--proxy-server=http://%s:%s@%s" % (UID,PWD,PROXY_IP))
事实上,我已经广泛搜索并且没有找到解决方案,这让我相信没有一个可能存在。
我找到了这个,但我无法理解它:
selenium chromedriver authentication proxy
不确定browswermob-proxy
是或应该做什么,或者如何在Python中实现和测试。除非绝对必要,否则我讨厌堆积创可贴解决方案。
我已经检查了网络上的大多数解决方案,并且没有一个通过chrome / firefox所需的身份验证工作正常。检查此链接:https://github.com/webdriverio/webdriverio/issues/324。最后,临时解决方案是将您的IP地址列入代理提供商的白名单。
在尝试了许多实际上没有正常工作的解决方案后,我终于设法使用之前答案中建议的扩展来设置经过身份验证的代理。你需要做的是输入这个链接:
http://crxextractor.com/并粘贴此网址:https://www.crx4chrome.com/crx/1446/
它允许您将扩展名下载为.crx文件而不进行安装。比我使用这段代码:
proxy = {'address': 'pr.oxylabs.io:7777',
'username': 'USERNAME',
'password': 'PASSWORD'}
capabilities = dict(DesiredCapabilities.CHROME)
capabilities['proxy'] = {'proxyType': 'MANUAL',
'httpProxy': proxy['address'],
'ftpProxy': proxy['address'],
'sslProxy': proxy['address'],
'noProxy': '',
'class': "org.openqa.selenium.Proxy",
'autodetect': False,
'socksUsername': proxy['username'],
'socksPassword': proxy['password']}
options = webdriver.ChromeOptions()
options.add_extension("./extension_2_0_0_0.crx")
driver = webdriver.Chrome(executable_path=CHROME_PATH, desired_capabilities=capabilities, chrome_options=options)
我找不到任何铬的解决方案。我们无法使用headless
选项添加扩展名。我正在使用Heroku和chrome-buildpack。有以下选项
xvfb
而不是无头选项并安装扩展我没有使用这些解决方法,而是切换到Firefox,我可以在代理身份验证弹出窗口中填写用户名和密码。如下所示。以下代码适用于使用Capybara的Ruby。你应该可以在你的平台上做这样的事情
page.driver.browser.switch_to.alert.send_keys('proxy-username' + Selenium::WebDriver::Keys::KEYS[:tab] + 'my-password')
page.driver.browser.switch_to.alert.accept
我花了很多时间做同样的事情。
Chrome仅使用安装它的操作系统的代理。您可以通过转到选项 - >查找:代理 - >更改代理设置来检查它
因此,如果没有额外的插件并配置此插件,则无法执行此操作。
或者您可以更改操作系统代理设置 - 这更容易。
你也可以使用phantomjs - 它有与chrome相同的引擎(WebKit)。使用这样的东西:
String PROXY = proxyIP + ":" + proxyPort;
String proxyAuth= proxyUser + ":" + proxyPass;
OpenQA.Selenium.Proxy proxy = new OpenQA.Selenium.Proxy();
proxy.HttpProxy = PROXY;
proxy.FtpProxy = PROXY;
proxy.SslProxy = PROXY;
proxy.SocksProxy = PROXY;
var serviceJS = PhantomJSDriverService.CreateDefaultService(phantomPath);
serviceJS.AddArguments("--proxy=" + PROXY, "--proxy-type=http", "--proxy-auth=" + proxyAuth);
这是一个临时解决方案可能在初始状态下工作:代码在Python中:首先从chrome插件存储下载插件:Proxy-Auto-Auth_v2.0.crx
options = webdriver.ChromeOptions()
options.add_extension("./Proxy-Auto-Auth_v2.0.crx")) #this will provide you a window to enter user name and proxy
driver = webdriver.Remote(command_executor=selenium_server,desired_capabilities=options.to_capabilities())
or
driver = webdriver.Chrome(chrome_options=options)
要在python selenium中使用auth代理,您可以使用seleniumwire。
首先,用pip install selenium-wire
安装它
然后从seleniumwire导入webdriver而不是selenium
from seleniumwire import webdriver
options = {
'proxy': {
'http': 'http://username:password@host:port',
'https': 'https://username:password@host:port',
'no_proxy': 'localhost,127.0.0.1' # excludes
}
}
browser = webdriver.Chrome(path_to_driver, seleniumwire_options=options)
现在,您可以使用与selenium完全相同的浏览器实例:browser.get('https://api.ipify.org')
等等...
This是我找到的最好的解决方案,也是唯一有效的解决方案 - 这个问题的所有其他答案都已过时。它基本上可以动态生成Chrome的auth扩展。只需使用脚本中定义的函数,如下所示:
driver = proxy_chrome(host, port, username, password)
driver.get("http://www.icanhazip.com/")
driver.get("https://www.reddit.com/")
print('Terminated without issues.')
请注意,这不适用于--headless选项。但是,在Linux上,您只需使用x虚拟帧缓冲区来模拟它。它在python中就像这样简单:
import xvfbwrapper
x = xvfbwrapper.Xvfb()
x.start()