0

我正在使用 ASP.NET 中的 Web 浏览器登录博彩网站并下注。

一旦找到团队并提出其点击方法,就会通过带有文本框的 javascript 加载侧框架/窗口以输入投注金额。

我试过了 :

var stakeTextboxElement = doc.GetElementById("stake");
stakeTextboxElement.Focus();
stakeTextboxElement.InnerText = "3";
webbrowser.navigate("javascript: placeBet();"); //they use javascript

这给了我一个错误,即我的出价不够高(如果是的话)。据我所知,它导航太快并且没有将 InnerText 读取为“3”;

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

SendKeys.Send("3"); 
webbrowser.navigate("javascript: placeBet();");

同样的错误。但是,如果我添加“Application.DoEvents();”,这将有效 就在导航之前。对 InnerText 示例执行相同操作不起作用。

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

4

2 回答 2

0

您的问题是使用专为 Web 服务器上的 UI 应用程序设计的控件。我认为您将需要使用消息循环来让浏览器“做事”,然后在您将 ASP.NET 请求返回给桌面浏览器之前返回给您。

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

  • 执行 ASP 东西的主线程(Page_Load等)
    • 然后,这使用类似AutoResetEvent线程之间的信号
    • 它将 AutoResetEvent 传递给您创建的派生控件
    • 它会等待以防止它在其他所有操作完成之前返回您的请求
  • 第二个线程,WebBrowser生活在其中
  • 第三个线程用于消息循环,执行WebBrowser事件句柄,如Navigating事件处理程序和我们的回调函数。这是您Set使用 AutoResetEvent 让主线程向原始调用者返回响应的地方。

然后可以使用创建消息循环System.Windows.Forms.Application.Run(ApplicationContext ctx),这避免了需要 Windows 窗体本身来启动 Web 浏览器。

这真的很复杂,但有人已经这样做了:CodePlex: Using the WebBrowser Control in ASP.NET

线程.睡眠

我们现在知道这对您不起作用

尝试使用Thread.Sleep

stakeTextboxElement.InnerText = "3";
System.Threading.Thread.Sleep(3000);
webbrowser.Navigate("javascript: placeBet();"); //they use javascript

带/不带复位事件的定时器

这可能与 Thread.Sleep 有相同的问题

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

function void DoNavigate(Object stateInfo) {
  AutoResetEvent arev = (AutoResetEvent)stateInfo; // *
  webbrowser.Navigate("javascript: placeBet();"); //they use javascript
  arev.Set(); // *
}

...
stakeTextboxElement.InnerText = "3";
// depending on your scenario you may need to wait for the navigate to happen, so use 
// a reset event for this
AutoResetEvent arev = new AutoResetEvent(false); // *
TimerCallback tcb = DoNavigate;
Timer stateTimer = new Timer(tcb, arev, 3000, Timeout.Infinite);
arev.WaitOne(); // *

应用程序.DoEvents

这在 ASP.NET 中并不真正可用,但是如果您使用的是 Windows 窗体(如果您使用的是 Win Forms 或 ASP.NET,我不清楚您的问题)并且应用程序正在冻结 UI,那么您可能需要让它使用Application.DoEvents.

于 2013-06-25T11:48:27.710 回答
0

尝试这个:

stakeTextboxElement.InnerText = "3";

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

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

此外,您不应使用脚本未使用的InnerText来获取输入的值,而应更新元素的Value属性。

stakeTextboxElement.Value = "3";
于 2013-06-25T12:09:12.940 回答