繁体   English   中英

C#字符串比较不起作用

[英]C# String comparison not working

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

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

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

更新

我最初忽略了这一点,这肯定与你的问题有关。 您正在调用click ,如scraper.clientBrowser.Document.GetElementById(order).InvokeMember("Click"); 这是在迭代中完成的,这很可能会操纵DOM - 不会吗? 我建议完全不同于这个问题。 你想要达到的目标是什么,(不是你想要怎么做)?

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

我能在这里找到一件事:
取消注释MessageBox.Show ,在消息框显示信息时, clientBrowser使用此时间来完成加载页面。 然后当您在消息框上按“确定”时,页面将加载完成,以便您获得结果。 当你评论它时,你不打算加载页面,所以结果是不同的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM