我正在处理我正在处理的应用程序中遇到这个奇怪的问题。
string searchText = "onMouseOver=\"CallList_onMouseOver(this);\" id=\"";
List<int> searchOrders = AllIndexesOf(scraper.clientBrowser.DocumentText, searchText);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < searchOrders.Count; i++)
{
string order = scraper.clientBrowser.DocumentText.Substring(searchOrders[i] + searchText.Length, 6);
scraper.clientBrowser.Document.GetElementById(order).InvokeMember("Click");
for (int j = 0; j < scraper.clientBrowser.Document.Window.Frames.Count; j++)
{
if (scraper.clientBrowser.Document.Window.Frames[j].Document != null && scraper.clientBrowser.Document.Window.Frames[j].Document.Body != null)
{
string orderText = scraper.clientBrowser.Document.Window.Frames[j].Document.Body.InnerText ?? "Nope";
//MessageBox.Show(j + Environment.NewLine + orderText);
if (!orderText.Contains("Nope"))
{
sb.AppendLine(orderText + Environment.NewLine);
}
}
}
}
Clipboard.SetText(sb.ToString());
问题是,每当我取消注释MessageBox.Show时,我都可以清楚地看到orderText填充了另一个值而不是“Nope”,Stringbuilder被填充,并且正确的文本被复制。
但是如果我评论Messagebox.Show,这个循环的结果总是“不”。我被困在这里,我不知道是什么原因导致这样的事情。
scraper.clientBrowser是一个System.Windows.Forms.WebBrowser。
更新 通过等待加载文档来解决问题,创建了这个机制:
public bool DocumentLoaded
{
get { return documentLoaded; }
set { documentLoaded = value; }
}
private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
this.DocumentLoaded = true;
this.clientBrowser = sender as WebBrowser;
}
void clientBrowser_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
this.DocumentLoaded = false;
}
然后在我正在使用的课程中:
while(!scraper.DocumentLoaded)
{
System.Threading.Thread.Sleep(100);
}
答案 0 :(得分:2)
听起来您需要确保页面已满载,就像可能存在竞争条件一样。我建议连接WebBrowser.DocumentCompleted
事件,然后尝试使用报废逻辑。
<强>更新强>
我最初忽略了这一点,这肯定与你的问题有关。您调用click
的行,如scraper.clientBrowser.Document.GetElementById(order).InvokeMember("Click");
。这是在迭代中完成的,这很可能会操纵 DOM - 不会吗?我建议完全不同于这个问题。你想要达到的目标是什么,(不是你想要怎么做)?
仅凭这一点,我建议您参考此SO Q / A并查看他们如何等待点击完成。
答案 1 :(得分:1)
我可以在这里招待一件事:
当您取消注释MessageBox.Show
时,在消息框显示信息时,clientBrowser
会使用此时间来完成加载页面。然后当您在消息框上按“确定”时,页面将加载完成,以便您获得结果。当你评论它时,你不会为加载页面而烦恼,所以结果是不同的。