filterOption.GetAttribute(“值”).Equals(“价格低\高”,StringComparison.InvariantCultureIgnoreCase)).SingleOrDefault(); if(filterElement.GetAttribute(“value”).等于(“price\u low\u high”)) { filterElement.SetAttribute(“选定”、“价格低/高”); filterElement.InvokeMember(“单击”); } bookCollection=webBrowser1.Document.GetElementsByTagName(“按钮”); foreach(bookCollection中的HtmleElement CureElement) { if(curElement.GetAttribute(“id”).Equals(“searchSubmit”)) { curElement.InvokeMember(“单击”); } } while(webBrowser1.ReadyState!=WebBrowserReadyState.Complete) { Application.DoEvents(); } MessageBox.Show(“已加载”); System.Timers.Timer myTimer=新的System.Timers.Timer(5000); myTimer.Enabled=true; myTimer.Start(); myTimer.Stop(); 如果(webBrowser1.ReadyState==WebBrowserReadyState.Complete)//从这里开始,代码不起作用。 { HtmlElementCollection avCollection=webBrowser1.Document.GetElementById(“filterAvailability”).GetElementsByTagName(“选项”); List avList=新列表(); foreach(avCollection中的HtmlElement avItem) { avList.Add(avItem); } HtmlElement元素= (HtmlElement)avList.Where(avOption=>avOption.GetAttribute(“值”).Equals(“1”)).SingleOrDefault(); 如果(avElement.GetAttribute(“值”)等于(“1”) { avElement.SetAttribute(“选定”、“1”); avElement.InvokeMember(“单击”); } bookCollection=webBrowser1.Document.GetElementsByTagName(“按钮”); foreach(bookCollection中的HtmleElement CureElement) { if(curElement.GetAttribute(“id”).Equals(“searchSubmit”)) { curElement.InvokeMember(“单击”); } } },c#,html,visual-studio-2010,debugging,C#,Html,Visual Studio 2010,Debugging" /> filterOption.GetAttribute(“值”).Equals(“价格低\高”,StringComparison.InvariantCultureIgnoreCase)).SingleOrDefault(); if(filterElement.GetAttribute(“value”).等于(“price\u low\u high”)) { filterElement.SetAttribute(“选定”、“价格低/高”); filterElement.InvokeMember(“单击”); } bookCollection=webBrowser1.Document.GetElementsByTagName(“按钮”); foreach(bookCollection中的HtmleElement CureElement) { if(curElement.GetAttribute(“id”).Equals(“searchSubmit”)) { curElement.InvokeMember(“单击”); } } while(webBrowser1.ReadyState!=WebBrowserReadyState.Complete) { Application.DoEvents(); } MessageBox.Show(“已加载”); System.Timers.Timer myTimer=新的System.Timers.Timer(5000); myTimer.Enabled=true; myTimer.Start(); myTimer.Stop(); 如果(webBrowser1.ReadyState==WebBrowserReadyState.Complete)//从这里开始,代码不起作用。 { HtmlElementCollection avCollection=webBrowser1.Document.GetElementById(“filterAvailability”).GetElementsByTagName(“选项”); List avList=新列表(); foreach(avCollection中的HtmlElement avItem) { avList.Add(avItem); } HtmlElement元素= (HtmlElement)avList.Where(avOption=>avOption.GetAttribute(“值”).Equals(“1”)).SingleOrDefault(); 如果(avElement.GetAttribute(“值”)等于(“1”) { avElement.SetAttribute(“选定”、“1”); avElement.InvokeMember(“单击”); } bookCollection=webBrowser1.Document.GetElementsByTagName(“按钮”); foreach(bookCollection中的HtmleElement CureElement) { if(curElement.GetAttribute(“id”).Equals(“searchSubmit”)) { curElement.InvokeMember(“单击”); } } },c#,html,visual-studio-2010,debugging,C#,Html,Visual Studio 2010,Debugging" />

C# 代码在调试时运行良好,但它不';如果没有调试,它将无法运行 string entry=Titleentry.Text; webBrowser1.导航(“http://www.bookdepository.com/search/advanced"); //HtmlElementCollection图书收藏; while(webBrowser1.ReadyState!=WebBrowserReadyState.Complete) { Application.DoEvents(); } HtmlElementCollection bookCollection=webBrowser1.Document.GetElementsByTagName(“输入”); foreach(bookCollection中的HtmleElement CureElement) { if((cureElement.GetAttribute(“id”).ToString()=“searchTitle”)) { curElement.SetAttribute(“值”,条目); } } HtmlElementCollection filterCollection=webBrowser1.Document.GetElementById(“filterSortBy”).GetElementsByTagName(“选项”); 列表过滤器列表=新列表(); foreach(filterCollection中的HtmleElement filterItem){filterList.Add(filterItem);} HtmlElement过滤器Element= (HtmleElement)filterList.Where(filterOption=>filterOption.GetAttribute(“值”).Equals(“价格低\高”,StringComparison.InvariantCultureIgnoreCase)).SingleOrDefault(); if(filterElement.GetAttribute(“value”).等于(“price\u low\u high”)) { filterElement.SetAttribute(“选定”、“价格低/高”); filterElement.InvokeMember(“单击”); } bookCollection=webBrowser1.Document.GetElementsByTagName(“按钮”); foreach(bookCollection中的HtmleElement CureElement) { if(curElement.GetAttribute(“id”).Equals(“searchSubmit”)) { curElement.InvokeMember(“单击”); } } while(webBrowser1.ReadyState!=WebBrowserReadyState.Complete) { Application.DoEvents(); } MessageBox.Show(“已加载”); System.Timers.Timer myTimer=新的System.Timers.Timer(5000); myTimer.Enabled=true; myTimer.Start(); myTimer.Stop(); 如果(webBrowser1.ReadyState==WebBrowserReadyState.Complete)//从这里开始,代码不起作用。 { HtmlElementCollection avCollection=webBrowser1.Document.GetElementById(“filterAvailability”).GetElementsByTagName(“选项”); List avList=新列表(); foreach(avCollection中的HtmlElement avItem) { avList.Add(avItem); } HtmlElement元素= (HtmlElement)avList.Where(avOption=>avOption.GetAttribute(“值”).Equals(“1”)).SingleOrDefault(); 如果(avElement.GetAttribute(“值”)等于(“1”) { avElement.SetAttribute(“选定”、“1”); avElement.InvokeMember(“单击”); } bookCollection=webBrowser1.Document.GetElementsByTagName(“按钮”); foreach(bookCollection中的HtmleElement CureElement) { if(curElement.GetAttribute(“id”).Equals(“searchSubmit”)) { curElement.InvokeMember(“单击”); } } }

C# 代码在调试时运行良好,但它不';如果没有调试,它将无法运行 string entry=Titleentry.Text; webBrowser1.导航(“http://www.bookdepository.com/search/advanced"); //HtmlElementCollection图书收藏; while(webBrowser1.ReadyState!=WebBrowserReadyState.Complete) { Application.DoEvents(); } HtmlElementCollection bookCollection=webBrowser1.Document.GetElementsByTagName(“输入”); foreach(bookCollection中的HtmleElement CureElement) { if((cureElement.GetAttribute(“id”).ToString()=“searchTitle”)) { curElement.SetAttribute(“值”,条目); } } HtmlElementCollection filterCollection=webBrowser1.Document.GetElementById(“filterSortBy”).GetElementsByTagName(“选项”); 列表过滤器列表=新列表(); foreach(filterCollection中的HtmleElement filterItem){filterList.Add(filterItem);} HtmlElement过滤器Element= (HtmleElement)filterList.Where(filterOption=>filterOption.GetAttribute(“值”).Equals(“价格低\高”,StringComparison.InvariantCultureIgnoreCase)).SingleOrDefault(); if(filterElement.GetAttribute(“value”).等于(“price\u low\u high”)) { filterElement.SetAttribute(“选定”、“价格低/高”); filterElement.InvokeMember(“单击”); } bookCollection=webBrowser1.Document.GetElementsByTagName(“按钮”); foreach(bookCollection中的HtmleElement CureElement) { if(curElement.GetAttribute(“id”).Equals(“searchSubmit”)) { curElement.InvokeMember(“单击”); } } while(webBrowser1.ReadyState!=WebBrowserReadyState.Complete) { Application.DoEvents(); } MessageBox.Show(“已加载”); System.Timers.Timer myTimer=新的System.Timers.Timer(5000); myTimer.Enabled=true; myTimer.Start(); myTimer.Stop(); 如果(webBrowser1.ReadyState==WebBrowserReadyState.Complete)//从这里开始,代码不起作用。 { HtmlElementCollection avCollection=webBrowser1.Document.GetElementById(“filterAvailability”).GetElementsByTagName(“选项”); List avList=新列表(); foreach(avCollection中的HtmlElement avItem) { avList.Add(avItem); } HtmlElement元素= (HtmlElement)avList.Where(avOption=>avOption.GetAttribute(“值”).Equals(“1”)).SingleOrDefault(); 如果(avElement.GetAttribute(“值”)等于(“1”) { avElement.SetAttribute(“选定”、“1”); avElement.InvokeMember(“单击”); } bookCollection=webBrowser1.Document.GetElementsByTagName(“按钮”); foreach(bookCollection中的HtmleElement CureElement) { if(curElement.GetAttribute(“id”).Equals(“searchSubmit”)) { curElement.InvokeMember(“单击”); } } },c#,html,visual-studio-2010,debugging,C#,Html,Visual Studio 2010,Debugging,这是全部代码。我试着用定时器来设置延迟,因为它反应太快了,但定时器也不工作,所以我不确定问题出在哪里 假设不起作用的代码创建一个包含3个计数的avList,并选择值1。值1表示网站的库存可用性 在没有调试的情况下运行时,它似乎完全忽略了在if条件下编写的代码 谢谢好的,问题似乎在于您设置代码的方式。你试图一件接一件地做事情,这会产生一些奇怪的结果。最好让API(WebBrowser)告诉您发生了什么,而不是在完成之前尝试查询它 有一个循环来检查“你完成了吗?”被认为是反向实践,因为它会阻塞代码,

这是全部代码。我试着用定时器来设置延迟,因为它反应太快了,但定时器也不工作,所以我不确定问题出在哪里

假设不起作用的代码创建一个包含3个计数的avList,并选择值1。值1表示网站的库存可用性

在没有调试的情况下运行时,它似乎完全忽略了在if条件下编写的代码


谢谢

好的,问题似乎在于您设置代码的方式。你试图一件接一件地做事情,这会产生一些奇怪的结果。最好让API(WebBrowser)告诉您发生了什么,而不是在完成之前尝试查询它

有一个循环来检查“你完成了吗?”被认为是反向实践,因为它会阻塞代码,并用一个浪费的等待循环占用处理器

您需要做的是浏览WebBrowser API的文档,找出WebBrowser如何与调用类通信。C#充分利用了事件和Delgates,因此我的建议是看看是否有适合您所寻找的事件。快速搜索得出以下结果:

这远比在满足条件之前旋转while循环更容易管理。让API通知您何时完成,然后您可以决定如何使用它。对于您的事件,下面是一个事件连接方式的示例:

因此,您不必在循环中检查它们,从而消耗处理时间

另外,由于您在.NET世界中,您可以访问linq。你不必写下你的循环就能找到一些东西。例如:

  string entry = Titleentry.Text;
        webBrowser1.Navigate("http://www.bookdepository.com/search/advanced");

        //HtmlElementCollection bookCollection;

        while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
        {
            Application.DoEvents();
        }

        HtmlElementCollection bookCollection = webBrowser1.Document.GetElementsByTagName("input");
        foreach (HtmlElement curElement in bookCollection)
        {
            if ((curElement.GetAttribute("id").ToString() == "searchTitle"))
            {
                curElement.SetAttribute("value", entry);
            }
        }



        HtmlElementCollection filterCollection = webBrowser1.Document.GetElementById("filterSortBy").GetElementsByTagName("option");
        List<HtmlElement> filterList = new List<HtmlElement>();
        foreach (HtmlElement filterItem in filterCollection) { filterList.Add(filterItem); }
        HtmlElement filterElement =
          (HtmlElement)filterList.Where(filterOption => filterOption.GetAttribute("value").Equals("price_low_high", StringComparison.InvariantCultureIgnoreCase)).SingleOrDefault();

        if (filterElement.GetAttribute("value").Equals("price_low_high"))
        {
            filterElement.SetAttribute("Selected", "price_low_high");
            filterElement.InvokeMember("click");
        }

        bookCollection = webBrowser1.Document.GetElementsByTagName("button");

        foreach (HtmlElement curElement in bookCollection)
        {
            if (curElement.GetAttribute("id").Equals("searchSubmit"))
            {
                curElement.InvokeMember("click");
            }
        }
        while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
        {
            Application.DoEvents();
        }

        MessageBox.Show("Loaded");

        System.Timers.Timer myTimer = new System.Timers.Timer(5000);
        myTimer.Enabled = true;
        myTimer.Start();
        myTimer.Stop();

        if (webBrowser1.ReadyState == WebBrowserReadyState.Complete) //from here on the code doesnt work.
        {
            HtmlElementCollection avCollection = webBrowser1.Document.GetElementById("filterAvailability").GetElementsByTagName("option");

            List<HtmlElement> avList = new List<HtmlElement>();
            foreach(HtmlElement avItem in avCollection)
            {
                avList.Add(avItem);
            }

            HtmlElement avElement =
                (HtmlElement)avList.Where(avOption => avOption.GetAttribute("value").Equals("1")).SingleOrDefault();

            if (avElement.GetAttribute("value").Equals("1"))
            {
                avElement.SetAttribute("Selected", "1");
                avElement.InvokeMember("click");
            }

            bookCollection = webBrowser1.Document.GetElementsByTagName("button");
            foreach (HtmlElement curElement in bookCollection)
            {
                if (curElement.GetAttribute("id").Equals("searchSubmit"))
                {
                    curElement.InvokeMember("click");
                }
            }
        }
我不能保证这有多快,但LINQ倾向于清理循环和搜索的逻辑

=====================================

如果您坚持使用您的代码,那么问题就产生于

    //Note: I have not tested this code, but this is close to what it should look like
    bookCollection.where(x => x.GetAttribute("id").ToString() == "searchTitle")
              .ForEach(x => x.SetAttribute("value", entry));
它不再处于“完整”状态。但是,您的while循环已经在上面检查了这个条件,所以您可以删除IF语句。我告诉你你有一个不确定的while循环就是因为这个原因。枚举值存在,因此您可以在WebBrowser进程仍在处理时查询它。这在多线程软件中很有用。然而,我的猜测是,这面旗子被翻转到了

     webBrowser1.ReadyState
就在页面显示之前。这就解释了为什么while循环会抓住它并存在。现在的问题是,它可能会将枚举翻转为未初始化,因为它已完成加载页面并已断开套接字连接。这将使其处于未初始化状态。此API依赖于状态机模式,并且状态的顺序可能与您认为的不同。这里有更多关于
   webBrowser1.ReadyState == WebBrowserReadyState.Complete