0

我正在尝试从 C# 应用程序中导航到带有隐藏浏览器的页面,单击链接并验证单击是否有效。流程: - 导航到“http://mypage” - 点击一个链接,链接的 HTML 代码是(调用 ComponentArt 回调):

<div id="ctl00_ctl00_PlaceHolderMain_Colleague1_linkAdd" onclick="colleagueCallback.callback('SOMENAME'); return false;">

添加同事 - 等待点击获得结果并更新页面 - 验证点击是否有效

我的问题:点击似乎没有完全完成,除非我调用 WebBroser.Print() (我不需要,只是尝试了一百万种方法来弄清楚点击后发生了什么,只有 Print 正在点击完全的)。

该代码工作得很好,导航工作正常,它可以找到我正在寻找的标签,点击事件正在触发(我得到一个中间更改),但回调没有完成,因为它只使用了 WebBrowser .Print()、所有其他 WebBrowser.Invalidate()、WebBrowser.Update()、WebBrowser.DocumentStream.Flush() 或 WebBroser.ResumeLayout() 都不会最终确定页面内的 ASP 回调...:

tempIE = 新的 WebBrowser();
tempIE.Navigate("http://mypage");
而(tempIE.ReadyState != WebBrowserReadyState.Complete)
{
      应用程序.DoEvents();
}
tempIE.AllowNavigation = true;
HtmlElement addDivTag = tempIE.Document.GetElementById("ctl00_ctl00_PlaceHolderMain_Colleague1_linkAdd");
if (addDivTag == null)
    throw (new Exception("Session.FollowPerson: 找不到添加标签"));
if ( addDivTag.FirstChild == null )
    throw (new Exception("Session.FollowPerson: 找不到添加链接"));
addDivTag.FirstChild.InvokeMember("点击");
而(tempIE.ReadyState != WebBrowserReadyState.Complete)
{
    应用程序.DoEvents();
}

在此之后,我正在验证 ComponentArt 服务器回调是否更改了其中一个标签,但只获取了中间标签。我正在监控的变化是:

<a href="javascript:void(0)">Add colleague</a>

将中介更改为(同时在回调中添加逻辑):

<img src="/images/loading.gif">

最后应该改为:

<br>Is your colleague</br>

任何人都知道 WebBroser.Print() 中发生了什么使页面完全完成回调?

4

1 回答 1

0

我相信 WebBrowser 在一个单独的线程中完成它的工作。因此,Print 将使用线程同步机制,例如 WaitXXX 类型的函数(它允许消息泵继续运行,同时导致 GUI 线程等待事件)。

DoEvents 可能不会让您的线程有机会运行(您使用的是单处理器 cpu 吗?)。尝试插入 Thread.Sleep(200) 并查看行为是否发生变化。如果是这样,请考虑更改为 WaitXXX 功能之一(我将查找我正在考虑的功能,然后进行编辑)。

编辑 是 MsgWaitXXX 函数,如果您选择使用它们,则需要 P/Invoke 它们。

我建议您挂钩 WebBrowser.Navigated 事件。把你的逻辑分成两部分。第一部分将调用 Navigate 并将您的 UI 标记为等待某事,第二部分将在事件触发时在您的 Navigated 处理程序中完成。

于 2010-11-09T15:36:03.307 回答