在开始写这个问题之前,我试图解决以下问题
// 1. navigate to page
// 2. wait until page is downloaded
// 3. read and write some data from/to iframe
// 4. submit (post) form
Run Code Online (Sandbox Code Playgroud)
问题是,如果网页上存在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 --; …Run Code Online (Sandbox Code Playgroud) 我以前做过这个,我不记得我是从网上下载了DLL还是其他东西,但我不想得病毒.我需要访问此命名空间,以便我可以拥有Webbrowswer控件不提供的额外功能.
如何准确添加Com引用.或者我是否需要来自某个地方的dll
谢谢
在我的应用程序中,我有一个包含浏览器控件的表单,我在其中显示SSRS报告.我想阻止用户右键单击浏览器控件并显示弹出菜单.理想情况下,我希望右键单击不执行任何操作.有没有办法可以做到这一点?
如果我不知道它的id,如何为文本框选择一个元素?
如果我知道它的id,那么我可以简单地写:
HtmlAgilityPack.HtmlNode node = doc.GetElementbyId(id);
Run Code Online (Sandbox Code Playgroud)
但是我不知道textbox的ID,我在HtmlagilityPack中找不到GetElementsByTagName方法,它在webbrowser控件中可用.在Web浏览器控件中我可以简单地写:
HtmlElementCollection elements = browser[i].Document.GetElementsByTagName("form");
foreach (HtmlElement currentElement in elements)
{
}
Run Code Online (Sandbox Code Playgroud)
编辑
这是我正在谈论的HTML表单
<form id="searchform" method="get" action="/test.php">
<input name="sometext" type="text">
</form>
Run Code Online (Sandbox Code Playgroud)
请注意我不知道表格的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>");
}
Run Code Online (Sandbox Code Playgroud)
这是page1.html的内容:
<html><body><p>Hello</p><embed src='C:/test.wmv' /></body></html>
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
再现问题时的奇怪行为:
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 …Run Code Online (Sandbox Code Playgroud) 我正在使用此方法以编程方式实例化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 = …Run Code Online (Sandbox Code Playgroud) .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>
Run Code Online (Sandbox Code Playgroud)
随着内容的增长,编辑体验变得非常滞后.输入或编辑内容几乎是不可能的.
这是一个完整的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();
}
}
Run Code Online (Sandbox Code Playgroud)
而我的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();
}
Run Code Online (Sandbox Code Playgroud)
我的问题非常类似于: Application.Run()导致应用程序挂起
这个问题也没有答案.
谢谢!