Selenium是一个自动化测试工具,可以模拟用户在浏览器中的操作。有时候我们需要使用代理服务器来访问一些受限制的网站,或者隐藏我们的真实IP地址。如果代理服务器需要用户名和密码进行验证,那么我们就需要在Selenium中设置代理用户名和密码。
然而,在C#中使用Selenium和爬虫代理加强版IP的时候,因为代理服务器需要用户名和密码进行认证,Chrome浏览器会弹出一个认证窗口要求输入用户名和密码,而这个窗口是由操作系统提供的,不属于网页元素,所以Selenium无法识别或控制它。这就导致了我们无法通过Selenium自动输入用户名和密码,并且也无法关闭这个窗口。
目前还没有直接的方法可以解决这个问题,但是有一些可能的替代方案:
- 使用其他支持设置代理用户名和密码的浏览器驱动,比如Firefox或者IE。
- 使用第三方库或者工具来模拟键盘输入或者鼠标点击来填写或者关闭认证窗口。
- 使用其他方式来绕过代理服务器的验证机制,比如修改请求头或者使用cookies。
- 使用一个Chrome扩展来自动填充认证窗口。
下面创建一个Chrome扩展插件,然后加载使用完成自动认证窗口
首先要实现Chrome扩展,你需要创建一个manifest.json文件,用来描述扩展的基本信息和权限:
{ "manifest_version": 2, "name": "uth_ext", "version": "1.0", "background": { "scripts": ["background.js"] }, "permissions": [ "webRequest", "webRequestBlocking", "<all_urls>" ] }
然后,你需要创建一个background.js文件,用来监听浏览器的请求,并在遇到认证窗口时自动填充用户名和密码
chrome.webRequest.onAuthRequired.addListener( function(details, callback) { // Replace with your own username and passwordvarusername='user'; varpassword='pass'; callback({authCredentials: {username: username, password: password}}); }, {urls: ["<all_urls>"]}, ['blocking'] );
最后,你需要将这两个文件打包成一个crx文件,并在Chrome浏览器中安装。
下面使用代码实现
usingOpenQA.Selenium; usingOpenQA.Selenium.Chrome; classProgram{ staticvoidMain(string[] args) { ChromeOptionsoptions=newChromeOptions(); // 设置代理服务器地址、端口、用户名和密码options.AddArgument("--proxy-server=www.16yun.cn:31111"); options.AddArgument("--proxy-username=16ip"); options.AddArgument("--proxy-password=16ps"); // 启用无头模式options.AddArgument("--headless"); // 加载Chrome扩展,用于自动填充认证窗口options.AddExtension("auth_ext.crx"); // 创建ChromeDriver实例IWebDriverdriver=newChromeDriver(options); // 访问需要认证的网页driver.Navigate().GoToUrl("https://www.amazon.com/"); // 等待认证窗口出现并自动填充WebDriverWaitwait=newWebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions.AlertIsPresent()); IAlertalert=driver.SwitchTo().Alert(); alert.SetAuthenticationCredentials("username", "password"); alert.Accept(); // 关闭浏览器driver.Quit(); } }
上面的代码通过加载Chrome扩展,实现认证窗口的自动填充,从而自动使用代理用户名和密码进行访问。