2016-02-22 100 views
1

我在我目前正在处理的应用程序中遇到这个奇怪的问题。C#字符串比较不起作用

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充满了比“不”,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); 
} 
+1

问题可能是,您的代码在调用“Click”之后加载页面之前获取body.InnerText。当您对messageBox取消注释时,浏览器有更多时间加载页面并获取正确的数据 – VDN

+0

您是否等待文档加载?尝试在'DocumentCompleted'事件上做所有这些事情(如果您使用的是框架,可能需要额外的调整) – Jcl

+0

单击元素后,DocumentCompleted不会触发@Jcl –

回答

2

这听起来就像您需要确保页面已完全加载一样,例如可能存在竞争条件。我会建议连线WebBrowser.DocumentCompleted事件,然后尝试您的报废逻辑。

更新

最初我忽略了这一点,这肯定是与您的问题。您正在调用click的行,如scraper.clientBrowser.Document.GetElementById(order).InvokeMember("Click");。这是在迭代中完成的,这将更有可能操纵DOM - 是不是?我建议去解决这个完全不同的问题。你试图完成什么,(不是你如何去做)?

有了这个,我建议你参考这个SO问答,看看他们是如何等待点击完成的。

+0

请试试这个,等一会儿。 –

+1

'LoadCompleted'适用于WPF版本(在'System.Windows.Controls'上)。 Winforms正确的是'DocumentCompleted'。您可能想要检查'DocumentCompleted'参数的URL是否与您正在导航的URL相同,特别是如果您使用的是框架('DocumentCompleted'会启动多次) – Jcl

+0

单击完成后DocumentCompleted不会触发元件。 @Jcl –

1

只有一件事我可以在这里客人:
当你取消注释MessageBox.Show,当时的消息框显示的信息,该clientBrowser利用这段时间来完成加载页面。然后当你在消息框上按OK时,页面加载完成,所以你得到结果。当你评论它时,你不会为页面加载,所以结果是不同的。