在开始写这个问题之前,我试图解决以下问题
// 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) 首先,由于我缺乏技术知识和可能的错误沟通而道歉,我对C#来说是一个新手.
我接管了一个项目,它抓取了一些网页并将它们保存为.png文件.
private void CaptureWebPage(string URL, string filePath, ImageFormat format)
{
System.Windows.Forms.WebBrowser web = new System.Windows.Forms.WebBrowser();
web.ScrollBarsEnabled = false;
web.ScriptErrorsSuppressed = true;
web.Navigate(URL);
while (web.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
System.Windows.Forms.Application.DoEvents();
System.Threading.Thread.Sleep(5000);
int width = web.Document.Body.ScrollRectangle.Width;
width += width / 10;
width = width <= 300 ? 600 : width;
int height = web.Document.Body.ScrollRectangle.Height;
height += height / 10;
web.Width = width;
web.Height = height;
_bmp = new System.Drawing.Bitmap(width, height);
web.DrawToBitmap(_bmp, new System.Drawing.Rectangle(0, 0, width, height));
_bmp.Save(filePath, format);
_bmp.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
但是,某些页面(只有少数几个)导致进程挂起.它不是所有的时间,而是经常.我发现问题似乎出现在以下代码部分:
while (web.ReadyState …Run Code Online (Sandbox Code Playgroud)