如何使用chrome驱动程序使用Java覆盖selenium2中的基本身份validation?
如何在selenium2 chrome驱动程序中覆盖基本身份validation? 我在我的项目中面临一个问题,即“需要身份validation”弹出窗口即将阻止webdriver继续导航。 请找到相同的附件截图。 我使用以下代码来实例化chrome驱动程序,
private WebDriver driver; @Override protected void setUp() throws Exception { super.setUp(); System.setProperty("webdriver.chrome.driver", "C:/Selenium/chromedriver.exe"); driver = new ChromeDriver(); } @Override protected void tearDown() throws Exception { // TODO Auto-generated method stub super.tearDown(); }
能否请你帮忙 –
谢谢,
我在一个多小时内遇到了同样的问题,最后@ kenorb的解决方案救了我。 简而言之,您需要添加一个浏览器扩展,为您进行身份validation(因为Selenium本身不能这样做!)。
以下是Chrome和Python的工作原理:
- 创建一个包含两个文件的zip文件proxy.zip :
background.js
var config = { mode: "fixed_servers", rules: { singleProxy: { scheme: "http", host: "YOU_PROXY_ADDRESS", port: parseInt(YOUR_PROXY_PORT) }, bypassList: ["foobar.com"] } }; chrome.proxy.settings.set({value: config, scope: "regular"}, function() {}); function callbackFn(details) { return { authCredentials: { username: "YOUR_PROXY_USERNAME", password: "YOUR_PROXY_PASSWORD" } }; } chrome.webRequest.onAuthRequired.addListener( callbackFn, {urls: [""]}, ['blocking'] );
不要忘记将YOUR_PROXY_ *替换为您的设置。
的manifest.json
{ "version": "1.0.0", "manifest_version": 2, "name": "Chrome Proxy", "permissions": [ "proxy", "tabs", "unlimitedStorage", "storage", "", "webRequest", "webRequestBlocking" ], "background": { "scripts": ["background.js"] }, "minimum_chrome_version":"22.0.0" }
-
将创建的proxy.zip添加为扩展名
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_extension("proxy.zip") driver = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options) driver.get("http://google.com") driver.close()
而已。 对我来说,就像一个魅力。 如果您需要动态创建proxy.zip或需要PHP示例,请转到原始post
我认为您正在谈论使用NTLM身份validation ( Windows集成身份validation )而不是基本身份validation ( 您在URL中提供凭据 )。 假设您可以尝试在chrome中运行NTML auth:
方法1
转到Internet Explorer,然后打开“Internet选项”。 请遵循以下步骤:
- 将您的站点添加到本地Intranet或可信站点
完成这些更改后,您的chrome身份validation应该有效。 如果您想知道IE设置如何影响Chrome行为,那么Chrome会使用IE安全设置进行身份validation。
一些好的资源/信用:
- 好细节
- Selenium问题详情
方法2
将您的站点添加到本地Intranet ,不要更改任何用于用户身份validation的内容。 默认情况下,选择第二个选项( 仅在Intranet站点中自动登录 )。
您可以尝试将登录凭据添加到url get请求(使用Java):
driver.get("http://username:password@google.com/")
我设法做两次发送凭据。 我不知道为什么,但是在第二次浏览器发送数据包时,身份validation标头会进行基本身份validation。
我的代码(使用C#):
string url = "http://user:password@google.com/"; IWebDriver webDriver = new ChromeDriver(); webDriver.Navigate().GoToUrl(url); webDriver.Url = url;
除配置网络代理首选项外 ,您还可以在/etc/environment
设置http_proxy
。
其他方法是使用Chrome HTTP私有代理 (基于Chrome-proxy-helper )。
这是PHP示例(在README中找到):
$pluginForProxyLogin = '/tmp/a'.uniqid().'.zip'; $zip = new ZipArchive(); $res = $zip->open($pluginForProxyLogin, ZipArchive::CREATE | ZipArchive::OVERWRITE); $zip->addFile('/path/to/Chrome-proxy-helper/manifest.json', 'manifest.json'); $background = file_get_contents('/path/to/Chrome-proxy-helper/background.js'); $background = str_replace(['%proxy_host', '%proxy_port', '%username', '%password'], ['5.39.64.181', '54991', 'd1g1m00d', '13de02d0e0z9'], $background); $zip->addFromString('background.js', $background); $zip->close(); putenv("webdriver.chrome.driver=/path/to/chromedriver"); $options = new ChromeOptions(); $options->addExtensions([$pluginForProxyLogin]); $caps = DesiredCapabilities::chrome(); $caps->setCapability(ChromeOptions::CAPABILITY, $options); $driver = ChromeDriver::start($caps); $driver->get('https://old-linux.com/ip/'); header('Content-Type: image/png'); echo $driver->takeScreenshot(); unlink($pluginForProxyLogin);
同样的逻辑也适用于其他语言。
SeleniumHQ GitHub上已经报道了更便携的解决方案。
也可以看看:
- 如何在Selenium WebDriver中对FirefoxDriver,ChromeDriver和IEdriver执行基本身份validation?
- 如何在Selenium中发送基本身份validation标头? 在SQA SE
- 使用ChromeDriver和无头模式下载Java,Selenium中的文件
- Java Selenium Chrome驱动程序 – 禁用图像加载
- 是否已弃用使用浏览器在Chrome中实时查看EventSource?
- 我可以从Java应用程序中删除下载的JNLP文件(Java Web start / JWS)吗?
- 使用selenium自定义Chrome webdriver以保存文件,而不会在下载时提示保存或丢弃文件
- 如何使用Java在Selenium WebDriver中禁用Chrome插件
- Java applet的替代方案,用于启动Microsoft Office应用程序
- Chrome错误:您使用的是不受支持的命令行标志: – ignore-certifcate-errors。 稳定性和安全性将受到影响
- JRE和Java插件之间的区别