c# - 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()?
解决方案
我认为这两行抛出异常:
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
。
推荐阅读
- mysql - mysql将数据加载到多个表中并循环
- linux - linux下从串口读取时的杂散传输(ttyUSB..)
- java - 无法从字符串反序列化“java.util.Date”类型的值
- c# - 旁加载的 UWP 应用正在启动之前由其他用户安装的旧版应用
- excel - VBA大于函数实际上显示小于答案
- database - 使用 UPDATE 交换 SQLite3 中列的值
- javascript - 是否可以在 dialogflow 内联编辑器中使用外部库?
- php - 尝试创建 CMS 但无法登录
- r - 单击具有相同 css RSelenium 的所有元素
- amazon-web-services - 在处理整个有效负载之前,S3Stream 正在关闭