【问题标题】:Docking in winform selenium instance instead of cefsharp对接在 winform selenium 实例而不是 cefsharp
【发布时间】:2021-03-15 18:22:46
【问题描述】:

我遇到了一个我似乎无法解决的问题,我在 Google 上搜索过,但似乎出现了同样的问题,但无法解决问题,或者至少我不明白。

我已将cefsharp 停靠在WinForms 面板中,并且可以注入javascript 将数据输入到表单字段中,但我更喜欢selenium 命令。

我要做的只是将 Selenium 浏览器停靠在 Winforms 应用程序中,就像我对 cefsharp 所做的那样,但是命令行控制台和浏览器独立加载,而不停靠在 winform 中。

我的代码: - 在表单浏览器上加载。

        private static ChromiumWebBrowser browser;

        public FormBrowser(string[] sitesList, string mode, FormMain formMain, Project _project, Func<string, Tuple<string, string, string>> getUserPassEmail)
        {
            InitializeComponent();
            bool proxyUsed = false;

            CefSharpSettings.SubprocessExitIfParentProcessClosed = true;
            if (!Cef.IsInitialized) // Check before Initialized.
            {
                // Init CEF.
                CefSettings settings = new CefSettings
                {
                    CachePath = Path.Combine(Directory.GetCurrentDirectory(), @"cache"),
                    UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36",
                    LogFile = @"logs\browser.log",
                    WindowlessRenderingEnabled = true,
                    MultiThreadedMessageLoop = true,
                    BrowserSubprocessPath = Path.Combine(Directory.GetCurrentDirectory(), @"CefSharp.BrowserSubprocess.exe"),
                    LogSeverity = LogSeverity.Error
                };

                if (_project.Proxy != "ip:port")
                {
                    settings.CefCommandLineArgs.Add("proxy-server", _project.Proxy);
                    proxyUsed = true;
                }

                Cef.EnableHighDPISupport();
                Cef.Initialize(settings);
            }
            // Init CEF.

            // Init Selenium.
            ChromeOptions options = new ChromeOptions();
            ChromeDriverService service = ChromeDriverService.CreateDefaultService();
            service.SuppressInitialDiagnosticInformation = true;
            options.AddArgument("--log-level=3");
            options.AddArgument("--start-maximized");
            options.AddExcludedArgument("enable-automation");
            options.AddAdditionalCapability("useAutomationExtension", false);
            options.AddArgument("remote-debugging-port=9222");
            options.BinaryLocation = Path.Combine(Directory.GetCurrentDirectory(), @"CefSharp.BrowserSubprocess.exe");
            ChromeDriver _driver = new ChromeDriver(service, options)
            {
                Url = "https://www.google.com/"
            };
            // Init Selenium.

            _sitesToProcess = sitesList; // Array of sites [ url1.com , url2.com ] etc.
            _modeToUse = mode;           // Mode either [REG] or [LAP].
            _formMain = formMain;        // Main UI object.

            string _mode = _modeToUse == "MODE_REG" ? "-[REG]" : "-[LAP]";

            try
            {
                browser = new ChromiumWebBrowser("https://www.google.com/");

                string[] _macroCode = File.ReadAllLines(@"engines\" + _sitesToProcess[0] + _mode);

                InitializeChromeBrowserAsync(_mode, _macroCode, _sitesToProcess[0], _project, getUserPassEmail, proxyUsed);
            }
            catch (Exception ex)
            {
                Helpers.DebugLogging($"[{DateTime.Now}]-[{ex}]");
            }
        }

然后在InitializeChromeBrowserAsync

        private async void InitializeChromeBrowserAsync(string _macroModeToUse, string[] _macroCode, string _site, Project _project, Func<string, Tuple<string, string, string>> getUserPassEmail, bool proxyUsed)
        {
            try
            {
                await ExcecuteMacroCode(_macroModeToUse, _macroCode, _site, _project, getUserPassEmail, proxyUsed);
            }
            catch (Exception ex)
            {
                Helpers.DebugLogging($"[{DateTime.Now}]-[{ex}]");
            }
        }

转到ExcecuteMacroCode

        public async Task ExcecuteMacroCode(string _macroModeToUse, string[] _macroCode, string _site, Project _project, Func<string, Tuple<string, string, string>> _getUserPassEmail, bool _proxyUsed)
        {
            var theProxy = _proxyUsed == true ? _project.Proxy : "NO_PROXY";
            Log.Add("Proxy used: " + theProxy);

            try
            {
                if (_macroModeToUse == "-[REG]")
                {
                    foreach (string _macroCodeFile in _macroCode)
                    {
                        string[] code = _macroCodeFile.Split('|');

                        // Sometimes a row might have 3 sections, account for this.
                        string theThirdValue = null;
                        if (code.Length > 2)
                        {
                            theThirdValue = code[2];
                        }

                        switch (code[0])
                        {
                            case "RJ_U":
                                string cleanUrl = code[1].Replace("{HOSTNAME}", _site);
                                browser.Load(cleanUrl);
                                panelBrowserMain.Controls.Add(browser);
                                browser.Dock = DockStyle.Fill;
                                browserMain.Text = cleanUrl;
                                browser.FrameLoadEnd += Browser_FrameLoadEnd;
                                browser.AddressChanged += Browser_AddressChanged;
                                await Task.Delay(int.Parse(_formMain.ComboBoxPauseInSeconds.Text + "000"));
                                break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Helpers.DebugLogging($"[{DateTime.Now}]-[{ex}]");
            }
        }

我已经删除了很多代码以使其尽可能相关,这部分 case "RJ_U": 是我们通过 cefsharp 转到该 URL 的地方。

我要问的是如何停靠 selenium 浏览器实例以便我可以使用 selenium 命令?还是那不可能?

在这个 Java 示例中:https://bitbucket.org/chromiumembedded/cef/wiki/UsingChromeDriver

我看不到它是如何停靠在 winform 中的。对此的任何帮助将不胜感激。

【问题讨论】:

  • 你说 selenium 而不是 CefSharp,你打算用什么浏览器?问题可以澄清一下。

标签: c# selenium selenium-webdriver selenium-chromedriver cefsharp


【解决方案1】:

尝试使用 if-elseif 语句而不是 switch-case 语句。 switch 语句可能与 async-await 有一些问题。

检查 await Task.delay & int.parse 一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-26
    • 2021-11-29
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多