【问题标题】:C# WebBrowser handling when triggering a ComponentArt CallBack click/event触发 ComponentArt 回调单击/事件时的 C# WebBrowser 处理
【发布时间】:2010-11-09 15:23:46
【问题描述】:

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

<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>

将中介更改为(同时在CallBack中进行添加逻辑):

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

最后应该改成:

<br>Is your colleague</br>

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

【问题讨论】:

    标签: c# events callback browser componentart


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我已经认为 ReadyState 不能完美工作,并增加了很大的延迟 (Thread.Sleep(50000))。当我从 IE 手动执行相同的流程时,点击完成所需的时间要少得多。还添加了 DocumentCompleted 事件处理程序,该处理程序会触发但单击仍未完成(页面的单独视图显示操作未完成)
    • 作为另一个测试,不要等待,而是尝试挂钩 Navigated 事件。当你这样做时,它会触发吗?
    • 我可以说一件事,DocumentCompleted 在我点击链接后不会触发......即使我使用 Print() 强制提交。
    • 您是否尝试过将 AllowNavigation = true 移动到您调用 Navigate 之前?
    • 您的回调是否有错误?你有 ScriptErrorsSuppressed == true 吗?
    猜你喜欢
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多