首页 > 解决方案 > C#捕获从不在进程中的函数返回的异常?

问题描述

我目前在一个循环中遇到了一个问题,基本上第一个过程在我调用时完美运行 -

代码示例:

public static void Search()
    {

        var Lines = File.ReadLines(@"in.txt").Take(1000).ToList();

        var query = string.Join(Environment.NewLine, Lines);

        WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(300));
        IWebElement element = wait.Until(ExpectedConditions.ElementToBeClickable(By.Name("search")));

        if (driver.FindElements(By.Name("search")).Count != 0)
        {
            driver.FindElement(By.Name("search")).SendKeys(query);

            System.Threading.Thread.Sleep(2000);

            driver.FindElement(By.Name("submitbtn")).Click();

            System.Threading.Thread.Sleep(2000);

            Console.WriteLine("Getting Results");

            if (driver.FindElements(By.CssSelector("tbody")).Count != 0)
            {
                Results();
            }
        }
    }

    public static void Results()
    {
        try
        {

            WebDriverWait wait1 = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
            IWebElement element1 = wait1.Until(ExpectedConditions.ElementToBeClickable(By.TagName("result")));


            if (driver.FindElements(By.TagName("result")).Count != 0)
            {

                var element2 = driver.FindElements(By.CssSelector("text"));

                foreach (var text in element2)
                {
                    var data = text.GetAttribute("outerHTML");

                    System.IO.File.AppendAllText("output.txt", data + Environment.NewLine);

                }

                driver.Navigate().Refresh();

                Search();

            }
            else
            {
                Console.WriteLine("No results");

                driver.Navigate().Refresh();

                Search();
            }

        }
        catch
        {
            Console.WriteLine("Failed to get results");
            driver.Close();
            Load();
        }
    }

但在返回Search()

第二次尝试,在结果中调用

    Search();

处理成功后Results();

在第二次 Search 过程中,Results() 捕获异常抛出,即

   Failed to get results

然而,Results() 函数不在进程中:S,因为我回调了 Search(),所以我的结论是我从未退出 Results,它仍在处理中,在 30 秒未找到元素后它会引发异常,但是如何我是否再次调用 Search() 以进行第二次尝试并退出 Results()?

标签: c#selenium

解决方案


我认为这两行抛出异常:

WebDriverWait wait1 = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
IWebElement element1 = wait1.Until(ExpectedConditions.ElementToBeClickable(By.TagName("result")));

从我的角度来看,您不需要它们,因为您已经:

if (driver.FindElements(By.TagName("result")).Count != 0)

如果您不确定,结果会DOM很快出现,您可以像这样添加暂停或环绕try/catch块:

try {
    WebDriverWait wait1 = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
    IWebElement element1 = wait1.Until(ExpectedConditions.ElementToBeClickable(By.TagName("result")));
}catch {
    Console.WriteLine("No results");
}
if (driver.FindElements(By.TagName("result")).Count != 0)

PS:我不确定您是否需要ExpectedConditions.ElementToBeClickable,因为您没有单击该元素。例如,您可以使用ExpectedConditions.ElementToBeVisible


推荐阅读