在开始写这个问题之前,我试图解决以下问题
// 1. navigate to page
// 2. wait until page is downloaded
// 3. read and write some data from/to iframe 
// 4. submit (post) form
问题是,如果网页上存在iframe,则DocumentCompleted事件将被触发多次(在每个文档完成之后).程序很可能试图从DOM中读取未完成且自然失败的数据.
但突然写下这个问题'如果'怪物启发了我,我解决了问题,我试图解决.由于我没有谷歌这个,我觉得在这里发布它会很好.
    private int iframe_counter = 1; // needs to be 1, to pass DCF test
    public bool isLazyMan = default(bool);
    /// <summary>
    /// LOCK to stop inspecting DOM before DCF
    /// </summary>
    public void waitPolice() {
        while (isLazyMan) Application.DoEvents();
    }
    private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) {
        if(!e.TargetFrameName.Equals(""))
            iframe_counter --; …我以前做过这个,我不记得我是从网上下载了DLL还是其他东西,但我不想得病毒.我需要访问此命名空间,以便我可以拥有Webbrowswer控件不提供的额外功能.
如何准确添加Com引用.或者我是否需要来自某个地方的dll
谢谢
在我的应用程序中,我有一个包含浏览器控件的表单,我在其中显示SSRS报告.我想阻止用户右键单击浏览器控件并显示弹出菜单.理想情况下,我希望右键单击不执行任何操作.有没有办法可以做到这一点?
如果我不知道它的id,如何为文本框选择一个元素?
如果我知道它的id,那么我可以简单地写:
HtmlAgilityPack.HtmlNode node = doc.GetElementbyId(id);
但是我不知道textbox的ID,我在HtmlagilityPack中找不到GetElementsByTagName方法,它在webbrowser控件中可用.在Web浏览器控件中我可以简单地写:
HtmlElementCollection elements = browser[i].Document.GetElementsByTagName("form");
foreach (HtmlElement currentElement in elements)
{
}
编辑
这是我正在谈论的HTML表单
<form id="searchform" method="get" action="/test.php">
<input name="sometext" type="text">
</form>
请注意我不知道表格的ID.并且在同一页面上可以有多种形式.我唯一知道的是"sometext",我想用这个名字来获取这个元素.所以我想我必须逐个解析所有表格然后找到这个名字"sometext"但是我该怎么做?
c# webbrowser-control getelementsbytagname html-agility-pack
我有一个.Net Froms应用程序,它通过WebBrowser控件显示网页.
无论如何,我可以检测到控件是否显示" 找不到页面 "或" 无法显示网页 "错误?似乎没有任何错误事件处理程序.
我注意到如果按回浏览器的后退按钮返回到Ask Question页面,会记住Title或Body部分.
我测试的所有浏览器都提供此功能,但我自己的项目中的表单不存在此功能.
我该如何处理这种效果?
UPDATE
我仍然没有任何线索,但猜猜是某种客户端缓存由http标头或javascript启用?
我相信我遇到了与在我的C#2008 WinForms应用程序中使用带有WebBrowser控件的embed标签相关的安全问题.
这是我的代码:
private void button2_Click(object sender, EventArgs e)
{
    webBrowser1.Navigate("C:/page1.html");
}
private void button1_Click(object sender, EventArgs e)
{
    webBrowser1.Navigate("about:blank");
    Thread.Sleep(1000);
    webBrowser1.Document.Write("<html><body><p>Hello</p><embed src='C:/test.wmv' /></body></html>");
}
这是page1.html的内容:
<html><body><p>Hello</p><embed src='C:/test.wmv' /></body></html>
Button1生成单词"Hello".Button2生成单词"Hello",其下方嵌入了一个电影播放器.
当我查看两个页面的源时,我注意到它们是相同的,除了源文件的名称.
这让我相信它与我的IE安全设置有关,但我注意到我为嵌入式内容设置了完整的权限.也许控件不能正确识别页面的来源,因此不允许使用嵌入标签.
我怎样才能以编程方式克服这个问题?我想避免将我的页面写入文件,并不惜一切代价导航到该文件.有关如何欺骗浏览器控件正常工作的任何建议?
第一编辑:
根据这篇文章Webbrowser Navigate Embedded Resource这将有效,但是我(JT)尝试了它并没有:
System.IO.Stream stream = this.GetType().Assembly.GetManifestResourceStream("WindowsFormsApplication1.Properties.test.html");
webBrowser1.DocumentStream = stream;
再现问题时的奇怪行为:
webBrowser1.Navigate("about:blank");
do
{
Thread.Sleep(100);
} while (webBrowser1.IsBusy == true);
//Method 1. Doesn't work
string htmlString1 = File.ReadAllText("C:/page1.html");
webBrowser1.Document.Write(htmlString1);
//Method 2. Doesn't work
string htmlString2 = "<html><body><p>Hello</p><embed src='C:/test.wmv' /></body></html>";
webBrowser1.Document.Write(htmlString2);
//Method 3. DOES …我正在使用此方法以编程方式实例化Web浏览器,导航到URL并在文档完成时返回结果.
如果文档加载时间超过5秒,我将如何停止Task并GetFinalUrl()返回null?
我见过许多使用a的例子,TaskFactory但我无法将其应用于此代码.
 private Uri GetFinalUrl(PortalMerchant portalMerchant)
    {
        SetBrowserFeatureControl();
        Uri finalUri = null;
        if (string.IsNullOrEmpty(portalMerchant.Url))
        {
            return null;
        }
        Uri trackingUrl = new Uri(portalMerchant.Url);
        var task = MessageLoopWorker.Run(DoWorkAsync, trackingUrl);
        task.Wait();
        if (!String.IsNullOrEmpty(task.Result.ToString()))
        {
            return new Uri(task.Result.ToString());
        }
        else
        {
            throw new Exception("Parsing Failed");
        }
    }
// by Noseratio - http://stackoverflow.com/users/1768303/noseratio    
static async Task<object> DoWorkAsync(object[] args)
{
    _threadCount++;
    Console.WriteLine("Thread count:" + _threadCount);
    Uri retVal = null;
    var wb = new WebBrowser();
    wb.ScriptErrorsSuppressed = ….net c# console-application webbrowser-control task-parallel-library
例如,我有以下简单的HTML页面,其中<span>[SOME FIELD]</span>重复多次以弥补大约200K的文件大小:
<!DOCTYPE html>
<html>
<head>
</head>
<body editableContent="true">
        <span>[SOME FIELD]</span>
        <span>[SOME FIELD]</span>
...
        <span>[SOME FIELD]</span>
</body>
</html>
随着内容的增长,编辑体验变得非常滞后.输入或编辑内容几乎是不可能的.
这是一个完整的repro案例.要查看我的意思,只需将光标移动到可编辑内容的末尾并尝试编辑即可.在IE和Chrome下它落后很长时间,几乎不可能打字.但它在Firefox下运行良好.
问题:我需要在IE下合理快速地运行它.
到目前为止,我已经接近IE8模拟(带<meta http-equiv="X-UA-Compatible" content="IE=8">),所以这是有效的(在IE下).
但是,我也需要支持IE=edge.任何关于如何实现这一点的建议将不胜感激.国际海事组织,这是一个错误(我提交这里IE和这里的Chrome),但我在寻找什么解决办法.
更新后,为使用HTML文档模式在独立IE浏览器或托管WebBrowser控件的自定义应用程序中加载的任何解决方案提供了赏金IE=edge.
html javascript internet-explorer webbrowser-control contenteditable
我正在建立一个冲浪到几个网站并做一些事情的程序.
在成功冲浪到5个网址之后,该程序在Application.Run()行之后挂起.该程序甚至没有进入处理程序功能,只是卡住了.此时CPU使用率为0.
我尝试以任何可能的方式关闭线程.我做错了什么?
我这样做:
[STAThread]
private static void Main(string[] args) 
{
    for (int i = 0; i < urls.Count; i++) 
    {
        var th = new Thread(() = > 
        {
            var weBrowser = new WebBrowser();
            weBrowser.AllowNavigation = true;
            weBrowser.DocumentCompleted += Handler;
            weBrowser.Navigate(urls[i]);
            Application.Run();
        });
        th.SetApartmentState(ApartmentState.STA);
        th.Start();
        th.Join();
    }
}
而我的Handle功能是:
private static void Handler(object sender, WebBrowserDocumentCompletedEventArgs e) 
{
    WebBrowser weBrowser = sender as WebBrowser;
    var htmlDocument = weBrowser.Document;
    /*do something*/
    Application.Exit();
    Application.ExitThread();
    weBrowser.Dispose();
    weBrowser.Stop();
    Thread.CurrentThread.Abort();
}
我的问题非常类似于: Application.Run()导致应用程序挂起
这个问题也没有答案.
谢谢!