51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 646|回复: 0
打印 上一主题 下一主题

如何使用Selenium和代理用户名和密码在C#中进行无头浏览?

[复制链接]
  • TA的每日心情
    无聊
    4 天前
  • 签到天数: 1050 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2023-4-18 13:20:38 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
    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扩展,实现认证窗口的自动填充,从而自动使用代理用户名和密码进行访问。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-25 11:20 , Processed in 0.063045 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表