Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.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# ASP.NET-WebBrowser-让它等待一两秒钟_C#_Asp.net_Multithreading_Automation_Browser - Fatal编程技术网

C# ASP.NET-WebBrowser-让它等待一两秒钟

C# ASP.NET-WebBrowser-让它等待一两秒钟,c#,asp.net,multithreading,automation,browser,C#,Asp.net,Multithreading,Automation,Browser,我正在使用ASP.NET中的Webbrowser登录到一个博彩网站并下注 一旦找到了团队并提出了它的click方法,javascript就会加载一个侧框/窗口,其中包含一个文本框以输入下注金额 我试过: var stakeTextboxElement = doc.GetElementById("stake"); stakeTextboxElement.Focus(); stakeTextboxElement.InnerText = "3"; webbrowser.navigate("javasc

我正在使用ASP.NET中的Webbrowser登录到一个博彩网站并下注

一旦找到了团队并提出了它的click方法,javascript就会加载一个侧框/窗口,其中包含一个文本框以输入下注金额

我试过:

var stakeTextboxElement = doc.GetElementById("stake");
stakeTextboxElement.Focus();
stakeTextboxElement.InnerText = "3";
webbrowser.navigate("javascript: placeBet();"); //they use javascript
这给了我一个错误,我的出价不够高(当它是)。据我所知,它的导航速度太快,没有将内部文本读为“3”

我在Windows窗体中完成了完全相同的场景,我没有设置InnerText,而是这样做了

SendKeys.Send("3"); 
webbrowser.navigate("javascript: placeBet();");
同样的错误。但是,如果我添加“Application.DoEvents();”的话,这是可行的就在飞机起飞前。对于InnerText示例,执行相同的操作不起作用


据我所知,我必须告诉webbrowser继续运行一两秒钟,以便它读取包含文本的文本框。

您的问题是使用了为web服务器上的UI应用程序设计的控件。我认为您需要使用消息循环,以便能够让浏览器“执行任务”,然后在将ASP.NET请求返回到桌面浏览器之前返回给您

本质上,该技术是基于
System.Windows.Forms.ApplicationContext
创建一个新的控件类,然后在创建该控件时将
ApartmentState
设置为STA。它本身包含创建
WebBrowser
控件的逻辑。那么你就有了:

  • 执行ASP内容的主线程(
    Page\u Load
    等)
    • 然后使用类似于
      AutoResetEvent
      的方法在线程之间发送信号
    • 它将自动resetEvent传递给您创建的派生控件
    • 它会等待,以防止在所有其他操作完成之前返回您的请求
  • 第二个线程,
    WebBrowser
    存在其中
  • 第三个线程用于消息循环,执行
    WebBrowser
    事件处理程序,如
    导航
    事件处理程序和回调函数。这是
    设置
    自动resetEvent以让主线程向原始调用方返回响应的地方
然后可以使用
System.Windows.Forms.Application.Run(ApplicationContext ctx)
创建消息循环,这样就不需要Windows表单本身来启动webbrowser

这确实很复杂,但有人已经做到了:

线,睡觉 我们现在知道这不适合你

尝试使用:

stakeTextboxElement.InnerText=“3”;
系统线程线程睡眠(3000);
webbrowser.Navigate(“javascript:placeBet();”)//他们使用javascript
带/不带重置事件的计时器 这可能与Thread.Sleep有相同的问题

如果这不起作用,请在几秒钟后使用a安排您的
Navigate
通话

函数void DoNavigate(对象状态信息){
自动恢复事件arev=(自动恢复事件)状态信息;//*
webbrowser.Navigate(“javascript:placeBet();”;//它们使用javascript
arev.Set();//*
}
...
stakeTextboxElement.InnerText=“3”;
//根据您的场景,您可能需要等待导航发生,因此请使用
//此的重置事件
自动恢复事件arev=新自动恢复事件(假);//*
TimerCallback tcb=DoNavigate;
Timer stateTimer=新计时器(tcb、arev、3000、Timeout.Infinite);
arev.WaitOne();//*
Application.DoEvents 这在ASP.NET中并不真正可用,但如果您使用windows窗体(我不清楚您的问题是使用Win forms还是ASP.NET),并且应用程序正在冻结UI,则您可能需要让它使用
应用程序执行事件。DoEvents

尝试以下操作:

stakeTextboxElement.InnerText = "3";

DateTime dueTime = DateTime.Now.Add(TimeSpan.FromSeconds(2));
while (DateTime.Now < dueTime)
{
    Application.DoEvents();
}

webbrowser.navigate("javascript: placeBet();");

除了这方面的法律问题。。自动化浏览器是错误的做法。如果你真的创建了网络请求,你会更幸运。到底有什么法律问题?如果我必须手动登录并下注,而不是通过应用程序下注,他们为什么会在意呢?另外,我已经设法让Webbrowser走到了这一步,让它等待文本框文本是最后一步:你真的应该阅读他们的使用条款。很多网站都反对使用应用程序,我只会阅读服务条款。我见过的一些投注网站禁止使用自动工具;stakeTextboxElement.Focus();stakeTextboxElement.InnerText=txtbetamount.Text;睡眠(3000)//到目前为止,我让它工作的唯一方法是:
SendKeys.Send(txtbetamount.Text);Application.DoEvents();webBrowser1.Navigate(“javascript:placeBet();”)我之所以尝试这个方法,是因为现在在WinForms中调试问题比较容易,我希望最终在ASP.NET中使用它。@AlanCiantar。我添加的计时器方法怎么样?如果表单处于冻结状态,则不要使用带有
/*
的行。如果您使用的是win窗体,则需要
DoEvents
,我不清楚您使用的是win窗体还是asp.net。@AndyBrown:IMHO睡眠或使用计时器延迟和等待具有相同的效果:它们冻结当前线程。这正是这个线程,它负责使web浏览器处理向前推进。因此,用Application.DoEvents继续处理事件似乎是唯一可行的解决方案。哈哈,很抱歉让人困惑。最后,我希望能够在后台完成这一切(WebBrowser从未显示过)——所有内容都在网站上自动完成。目前我已经创建了两个项目——一个asp.net webforms和一个普通的windows窗体应用程序。我正在使用windows窗体查看webbrowser目前是否工作(调试/测试目的)。这实际上正确地填充了文本框,但它仍然告诉我赌注太低。(绝对不是)我稍后会继续研究这个问题。好的,我想我看到了问题:不要使用InnerText,而是元素的Value属性。我想你的意思是stakeTextboxElement.Value = "3";