C# 字符串比较不起作用

本文关键字:不起作用 比较 字符串 | 更新日期: 2023-09-27 18:35:37

我在当前正在处理的应用程序中遇到了这个奇怪的问题。

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"之外的另一个值,字符串生成器被填充,并且复制了正确的文本。

但是,如果我对Messagebox.Show发表评论,则此循环的结果始终是"Nope"。我被困在这里,我不知道是什么会导致这样的事情。

The 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);
}

C# 字符串比较不起作用

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

更新

我最初忽略了这一点,这肯定与您的问题有关。你调用click的行,就像scraper.clientBrowser.Document.GetElementById(order).InvokeMember("Click");一样。这是在迭代中完成的,它很可能会操纵 DOM——不是吗?我建议以完全不同的方式处理这个问题。你到底想实现什么(不是你想怎么做)?

仅凭这一点,我建议您参考此SO Q/A,看看他们如何等待点击完成。

我只能在这里做客:
当您取消注释MessageBox.Show 时,在消息框显示信息时,clientBrowser使用此时间完成页面加载。然后,当您在消息框上按"确定"时,页面加载完成,因此您将获得结果。当您评论它时,您不会为页面加载而哀悼,因此结果是不同的。