51Testing软件测试论坛

标题: 如何使用Selenium和代理用户名和密码在C#中进行无头浏览? [打印本页]

作者: lsekfe    时间: 2023-4-18 13:20
标题: 如何使用Selenium和代理用户名和密码在C#中进行无头浏览?
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 password
      var username = 'user';
      var password = 'pass';
      callback({authCredentials: {username: username, password: password}});
    },
    {urls: ["<all_urls>"]},
    ['blocking']
  );


  最后,你需要将这两个文件打包成一个crx文件,并在Chrome浏览器中安装。
  下面使用代码实现:
  using OpenQA.Selenium;
  using OpenQA.Selenium.Chrome;
  class Program
  {
      static void Main(string[] args)
      {
          ChromeOptions options = new ChromeOptions();
          // 设置代理服务器地址、端口、用户名和密码
          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实例
          IWebDriver driver = new ChromeDriver(options);
          // 访问需要认证的网页
          driver.Navigate().GoToUrl("https://www.amazon.com/");
          // 等待认证窗口出现并自动填充
          WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
          wait.Until(ExpectedConditions.AlertIsPresent());
          IAlert alert = driver.SwitchTo().Alert();
          alert.SetAuthenticationCredentials("username", "password");
          alert.Accept();
          // 关闭浏览器
          driver.Quit();
      }
  }


  上面的代码通过加载Chrome扩展,实现认证窗口的自动填充,从而自动使用代理用户名和密码进行访问。






欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2