Selenium 4 中加入了对新版 Chromium Edge 的支持,但其仍处于 alpha 阶段,没有正式发布

如果使用最新稳定版的 Selenium 操作 Chromium Edge,则需要一些其他的操作

环境

  • Windows 1909
    • macOS 和 Linux 的使用方式相同
  • dotnet core 3.1
    • 其他语言可能有其他方法
  • Microsoft Edge (Chromium)
  • Edge Webdriver

参考

步骤

  1. 环境准备
    • 根据已安装的 Edge 版本下载对应的 Webdriver
    • 将 Webdriver(名称为 msedgedriver.exe)移动到与 msedge.exe 同级目录下(默认安装路径为 C:\Program Files (x86)\Microsoft\Edge\Application
    • 将 Webdriver 的路径加入环境变量
  2. 实例
    • 在项目中引入 Selenium.WebDriverMicrosoft.Edge.SeleniumTools
    • 使用 dotnet core 打开一个页面
      using Microsoft.Edge.SeleniumTools;
      //...
      var options = new EdgeOptions();
      options.UseChromium = true;
      // options.BinaryLocation = @"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe";
      options.AddArgument("disable-gpu");
      options.AddArgument("--no-sandbox");
      options.AddArgument("--disable-dev-shm-usage");
      options.AddUserProfilePreference("profile.managed_default_content_settings.images", 2);
      
      string source = string.Empty;
      using (var edge = new EdgeDriver(options)) {
          edge.Navigate().GoToUrl(url);
          Thread.Sleep(5000);
          source = edge.PageSource;
          edge.Quit();
      }
      
      Console.WriteLine(source);
      //...

      注意不要引用 Selenium.WebDriver 官方的 OpenQA.Selenium.Edge,会与 Microsoft.Edge.SeleniumTools 包冲突

      前者的 EdgeOptions 内没有定义 UseChromium,无法正常使用新版 Edge

Continue reading “Dotnet Core Selenium 3 自动化 Chromium Edge”

在 MD5 Encryption in .NET/.NET Core 中写了一个MD5加密模块,在使用中访问加载了此模块的页面会立即报错“InvalidOperationException: Unable to resolve service for type”。

原因是我在Controller代码中使用了依赖注入的写法,但是Startup.cs中没有注入该模块。

参考

步骤

  1. 我的Controller代码:
    public class LoginController : Controller
    {
            //加密模块
            private readonly Encryption encryption;
            private readonly FamilySysDbContext db;
    
            public LoginController(FamilySysDbContext _db, Encryption _encryption)
            {
                db = _db;
                encryption = _encryption;
            }
                ... ...
    }
  2. 需要在Startup.cs中依赖注入该模块:
    public void ConfigureServices(IServiceCollection services) {
                    ... ...
        //加密模块
        services.AddScoped<Encryption>();
    
        ... ...
    
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

有三种方法实现依赖注入,分别为AddTransient()AddSingleton()AddScoped()。关于它们的区别可见 asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

Enviroment

  • .NET Core 2.1

References

Step

To acheive the encryption purpose, all we need to do is copy&paste. Usage is written in the MSDN page I posted above.

public class Encryption {
    private MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

    public string Encrypt(string key)
    {
        byte[] data = md5.ComputeHash(Encoding.Default.GetBytes(key));
        StringBuilder sBuilder = new StringBuilder();
        for (int i = 0; i < data.Length; i++)
        {
            sBuilder.Append(data[i].ToString("x2"));
        }

        return sBuilder.ToString();
    }
}

I wrote it as a standalone module in my project, it’s easier to modify/add things in the future.