2016-02-22 99 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時,頁面加載完成,所以你得到結果。當你評論它時,你不會爲頁面加載,所以結果是不同的。