C# WPF应用程序在单击按钮后启动控制台并使xaml崩溃
我创建了一个Selenium控制台Bot,现在我想用WPF启动它。所以我创建了一个简单的窗口,并添加了一个按钮,用来启动我的机器人,我已经将其改写为WPF。它启动并工作,但会使xaml窗口崩溃并打开一个控制台(这不应该发生或应该发生?)。然后它将控制台留空,并在VisualStudio控制台中写下它应该做的事情。它发生在我启动方法C# WPF应用程序在单击按钮后启动控制台并使xaml崩溃,c#,wpf,selenium,console,C#,Wpf,Selenium,Console,我创建了一个Selenium控制台Bot,现在我想用WPF启动它。所以我创建了一个简单的窗口,并添加了一个按钮,用来启动我的机器人,我已经将其改写为WPF。它启动并工作,但会使xaml窗口崩溃并打开一个控制台(这不应该发生或应该发生?)。然后它将控制台留空,并在VisualStudio控制台中写下它应该做的事情。它发生在我启动方法检查项(\u驱动程序)时。有什么可能的解决办法吗?我不介意启动控制台在后台运行,但为什么它会使主窗口崩溃,使我无法移动它或对它执行任何操作 private IWebDr
检查项(\u驱动程序)
时。有什么可能的解决办法吗?我不介意启动控制台在后台运行,但为什么它会使主窗口崩溃,使我无法移动它或对它执行任何操作
private IWebDriver Setup(IWebDriver driver)
{
var option = new ChromeOptions();
option.AddArgument("--headless");
option.AddArgument("--silent");
option.AddArgument("--disable-gpu");
option.AddArgument("--log-level=3");
var service = ChromeDriverService.CreateDefaultService();
service.SuppressInitialDiagnosticInformation = true;
_driver = new ChromeDriver(service, option);
//driver.Navigate().GoToUrl("");
_driver.Navigate().GoToUrl("urlofmychoice");
_driver.Manage().Window.Maximize();
_driver.Manage().Timeouts().ImplicitWait =
TimeSpan.FromSeconds(7); // breaks in between actions taken by webDriver
_driver.FindElement(By.XPath("/html/body/div[2]/div/a")).Click(); // click got it (need to add fake cookie)
_driver.FindElement(By.Id("header-email"))
.SendKeys("myemail"); // enters my login (need to make it adjustable)
_driver.FindElement(By.Id("header-password"))
.SendKeys("mypassword" + Keys.Enter); // enters my password (need to make it adjustable)
var username = _driver.FindElement(By.XPath("/html/body/header/section[1]/div/div[2]/div/a/span"))
.Text; // Get username from the site and saves to username
tradeUrl = "ulrIneed" + username; // initialize tradeUrl
//_driver.Navigate().GoToUrl(tradeUrl); // goes to tradeUrl
return _driver;
}
private void CheckItems(IWebDriver driver)
{
while (true)
{
_driver.Navigate().GoToUrl(tradeUrl);
var trades = _driver.FindElements(By.ClassName("rlg-trade-display-header")); // add all trades to list
for (var i = 0; i < trades.Count; i++) // loop to check all trades
{
if (i == 0)
Console.WriteLine("\n Active Trades: " + trades.Count);
var text = _driver
.FindElement(By.XPath(
"/html/body/main/div/div/div/div[4]/div[" + (i + 1) + "]/div[1]/div/div/span"))
.Text.Split(); // reads text from trade and adjust it for the program
var test = "Trade " + (i + 1) + " was last updated " + text[1] + " " + text[2] + " ago.";
Console.WriteLine(test);
var x = int.Parse(text[1]); // convert string to int to check time later
if (text[2] == "seconds")
continue;
if (text[2] == "hours" || text[2] == "hour" || text[2] == "days" || text[2] == "day" ||
text[2] == "month" || text[2] == "months" || x > 15)
{
var element1 =
_driver.FindElement(By.XPath("/html/body/main/div/div/div/div[4]/div[" + (i + 1) +
"]/div[1]/a/div"));
var actions1 = new Actions(_driver);
actions1.MoveToElement(element1).Click()
.Perform(); // scrolls down to choosen element and clicks it
_driver.FindElement(By.XPath("/html/body/main/div/div/div/div[2]/a[1]"))
.Click(); // click choosen element
var element = _driver.FindElement(By.Name("btnSubmit"));
var actions = new Actions(_driver);
actions.MoveToElement(element).Click()
.Perform(); // scrolls down to choosen element and clicks it
driver.Navigate().GoToUrl(tradeUrl);
Thread.Sleep(2000);
}
}
Thread.Sleep(15000); // wait 15 second before next loop
}
}
private void BtnStart_OnClick(object sender, RoutedEventArgs e)
{
Setup(_driver);
CheckItems(_driver);
}
}
专用IWebDriver设置(IWebDriver)
{
var option=新的色度选项();
option.AddArgument(“--headless”);
option.AddArgument(“--silent”);
option.AddArgument(“--disable gpu”);
option.AddArgument(“--log level=3”);
var service=ChromeDriverService.CreateDefaultService();
service.SuppressInitialDiagnosticInformation=true;
_驱动程序=新的镀铬驱动程序(服务,选项);
//driver.Navigate().gotour(“”);
_driver.Navigate().gotour(“urlofmychoice”);
_driver.Manage().Window.Maximize();
_driver.Manage().timeout().ImplicitWait=
TimeSpan.FromSeconds(7);//在webDriver执行的操作之间中断
_driver.FindElement(By.XPath(“/html/body/div[2]/div/a”)。单击();//单击获得它(需要添加假cookie)
_driver.FindElement(By.Id(“标题电子邮件”))
.SendKeys(“myemail”);//输入我的登录名(需要使其可调整)
_driver.FindElement(By.Id(“标题密码”))
.SendKeys(“mypassword”+Keys.Enter);//输入我的密码(需要使其可调)
var username=_driver.FindElement(By.XPath(“/html/body/header/section[1]/div/div[2]/div/a/span”))
.Text;//从站点获取用户名并保存到用户名
tradeUrl=“ulrIneed”+用户名;//初始化tradeUrl
//_driver.Navigate().gotour(tradeUrl);//转到tradeUrl
返回驱动程序;
}
专用无效检查项(IWebDriver)
{
while(true)
{
_driver.Navigate().gotour(tradeUrl);
var trades=_driver.FindElements(By.ClassName(“rlg交易显示标题”);//将所有交易添加到列表中
for(var i=0;i15)
{
变量元素1=
_FindElement(By.XPath(“/html/body/main/div/div/div/div[4]”/div[”+(i+1)+
“]/div[1]/a/div”);
var actions1=新操作(_驱动程序);
操作1.MoveToElement(元素1)。单击()
.Perform();//向下滚动到choosen元素并单击它
_FindElement(By.XPath(“/html/body/main/div/div/div/div[2]/a[1]”)
.Click();//单击选择元素
var元素=_driver.FindElement(By.Name(“btnSubmit”);
var操作=新操作(_驱动程序);
actions.MoveToElement(元素)。单击()
.Perform();//向下滚动到choosen元素并单击它
driver.Navigate().gotour(tradeUrl);
《睡眠》(2000年);
}
}
Thread.Sleep(15000);//在下一个循环之前等待15秒
}
}
私有void BtnStart_OnClick(对象发送方,路由目标)
{
设置(_驱动程序);
检查项目(_驱动程序);
}
}
如果您的问题是WPF窗口没有响应,那是因为您正在从UI线程同步调用CheckItems(\u driver)
。因此,BtnStart\u OnClick
处理程序一直在等待该方法返回控制,而它从来没有返回过控制(它基本上是一个while(true)
循环,没有任何中断
)。因此,线程被此方法“窃取”或“占用”,UI没有响应。解决方案是将此方法分派给另一个线程。但是,如果您的窗口以其他方式崩溃,您应该提供更多详细信息,例如异常消息和/或堆栈跟踪。作为补充说明,我建议您放弃使用while(true)
和Thread.Sleep
的方法。您的目标似乎是以固定的速率重复运行一个过程,我认为某种计时器将是更好的选择。谢谢大家的建议!我肯定会尝试从另一个线程分派此方法,因为这正是错误的原因。你说定时器是什么意思?比如循环“那个”时间?我需要这个方法工作,直到用户决定停止它,所以我需要无限循环。另外,Thread.Sleep
需要让循环在再次启动之前等待一段时间,这样用户就不会每秒收到结果的垃圾邮件。我的意思是根本不使用循环。相反,在过程结束时,创建一个计时器,它将