Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF应用程序在单击按钮后启动控制台并使xaml崩溃_C#_Wpf_Selenium_Console - Fatal编程技术网

C# WPF应用程序在单击按钮后启动控制台并使xaml崩溃

C# WPF应用程序在单击按钮后启动控制台并使xaml崩溃,c#,wpf,selenium,console,C#,Wpf,Selenium,Console,我创建了一个Selenium控制台Bot,现在我想用WPF启动它。所以我创建了一个简单的窗口,并添加了一个按钮,用来启动我的机器人,我已经将其改写为WPF。它启动并工作,但会使xaml窗口崩溃并打开一个控制台(这不应该发生或应该发生?)。然后它将控制台留空,并在VisualStudio控制台中写下它应该做的事情。它发生在我启动方法检查项(\u驱动程序)时。有什么可能的解决办法吗?我不介意启动控制台在后台运行,但为什么它会使主窗口崩溃,使我无法移动它或对它执行任何操作 private IWebDr

我创建了一个Selenium控制台Bot,现在我想用WPF启动它。所以我创建了一个简单的窗口,并添加了一个按钮,用来启动我的机器人,我已经将其改写为WPF。它启动并工作,但会使xaml窗口崩溃并打开一个控制台(这不应该发生或应该发生?)。然后它将控制台留空,并在VisualStudio控制台中写下它应该做的事情。它发生在我启动方法
检查项(\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
需要让循环在再次启动之前等待一段时间,这样用户就不会每秒收到结果的垃圾邮件。我的意思是根本不使用循环。相反,在过程结束时,创建一个计时器,它将