【发布时间】: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