【问题标题】:C# catch exception returning from function not in process?C#捕获从不在进程中的函数返回的异常?
【发布时间】:2018-07-14 22:08:43
【问题描述】:

我目前在循环中遇到问题,基本上第一个进程在我调用时运行良好 -

代码示例:

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

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

   Failed to get results

但是,Results() 函数不在处理中,但是如何再次调用 Search() 以进行第二次尝试并退出 Results()?

【问题讨论】:

    标签: c# selenium


    【解决方案1】:

    我认为这两行抛出异常:

    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

    【讨论】:

    • 是的,我确实假设 wait1.until 元素存在引发了异常,但在我继续其余请求代码之前,该元素必须是可点击/可见的,它在我第一次完美运行时调用该函数,但是当我返回 Search();显然元素“结果”不再可见/可点击,因此在 30 秒后它会引发异常。但我想在返回 search();从结果();它会退出结果();?所以解决方案是我假设成功结束结果函数然后返回搜索,但我该怎么做呢?
    • 但根据我的建议,您将返回 search()
    • 问题是即使我返回搜索(),结果()仍然寻找元素结果,它好像它没有退出re
    • argh 似乎其他人也有类似的问题,似乎 selenium/c# 在完成“SendKeys”字符串之前在函数中执行下一个进程..:/
    • stackoverflow.com/questions/24945082/… 还有很多关于 sendkeys 在继续下一个任务之前没有完成输入
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    相关资源
    最近更新 更多