如何防止 C# 和 Selenium 退出代码 0
Posted
技术标签:
【中文标题】如何防止 C# 和 Selenium 退出代码 0【英文标题】:How can I prevent C# and Selenium from exiting code 0 【发布时间】:2020-10-19 18:13:10 【问题描述】:while (1 == 1)
int questions = 0;
Thread.Sleep(500);
try
driver.FindElement(By.XPath("//*[@id='root']/div/main/div[2]/div/div[1]/button[1]"));
questions++;
catch (Exception e)
return;
try
driver.FindElement(By.XPath("//*[@id='root']/div/main/div[2]/div/div[1]/button[2]"));
questions++;
catch (Exception e)
return;
try
driver.FindElement(By.XPath("//*[@id='root']/div/main/div[2]/div/div[1]/button[3]"));
questions++;
catch (Exception e)
return;
try
driver.FindElement(By.XPath("//*[@id='root']/div/main/div[2]/div/div[1]/button[4]"));
questions++;
catch (Exception e)
return;
if (questions == 0)
return;
else if (questions == 1)
MessageBox.Show("1", "1");
driver.FindElement(By.XPath("//*[@id='root']/div/main/div[2]/div/div[1]/button[1]")).Click();
else if (questions == 2)
MessageBox.Show("2", "2");
String[] av2 = "//*[@id='root']/div/main/div[2]/div/div[1]/button[1]",
"//*[@id='root']/div/main/div[2]/div/div[1]/button[2]";
Random random = new Random();
int a = random.Next(av2.Length);
driver.FindElement(By.XPath(av2[a])).Click();
else if (questions == 3)
MessageBox.Show("3", "3");
String[] av3 =
"//*[@id='root']/div/main/div[2]/div/div[1]/button[1]",
"//*[@id='root']/div/main/div[2]/div/div[1]/button[2]",
"//*[@id='root']/div/main/div[2]/div/div[1]/button[3]"
;
Random random = new Random();
int a = random.Next(av3.Length);
driver.FindElement(By.XPath(av3[a])).Click();
else if (questions == 4)
MessageBox.Show("4", "4");
String[] av4 =
"//*[@id='root']/div/main/div[2]/div/div[1]/button[1]",
"//*[@id='root']/div/main/div[2]/div/div[1]/button[2]",
"//*[@id='root']/div/main/div[2]/div/div[1]/button[3]",
"//*[@id='root']/div/main/div[2]/div/div[1]/button[4]"
;
Random random = new Random();
int a = random.Next(av4.Length);
driver.FindElement(By.XPath(av4[a])).Click();
Console.WriteLine(questions + " <");
我一点经验都没有,也不知道为什么这个类一直以代码 0 退出。我尝试了多种方法,但都没有奏效。所以,我想做的是让这段 C# 代码每 0.5 秒检查一次带有 selenium 的 xpath。但就像现在一样,它以退出代码 0 退出。我该如何解决这个问题?
【问题讨论】:
当出现错误(异常)时,您将退出(返回)您的代码,而不会显示任何消息。至少打印异常信息 这不是像在旧的 C# 中那样 - 您需要将您的应用程序设置为“int main”,然后返回您想要的“int”代码吗? 附注,Random random = new Random();
将 this 的范围设置在顶部,而不是本地。
仅供参考,人们普遍认为while(true)
更具可读性/有意性。
如果您不希望循环在catch
块中退出,您应该删除return
语句。或者,如果您想以非 0 值退出,则可以调用 Environment.Exit(someExitCode)
(或 return someExitCode;
,如果这是在 Main
方法中并且它被定义为返回 int
)。如果出现异常,你还不清楚你想做什么。
【参考方案1】:
return
语句,如果放在Main
函数中,则停止程序的执行。让你的代码运行起来,并添加一些逻辑来防止控制台应用程序关闭
using System;
namespace ConsoleApp7
class Program
static void Main(string[] args)
DoYourThings();
Console.WriteLine("Press any key to close application...");
Console.ReadKey(); // application hangs here until user clicks any button,
// so you have time to examine console window
static void DoYourThings()
while (true)
try
// some code
catch (Exception e)
Console.WriteLine(e.Message); // output exception message
return; // exits DoYourThings function
【讨论】:
return
语句不是破坏了while
循环的目的吗?
OP 在 catch 块中有它,我省略了那部分代码只是为了说明它的功能。包含它以进行澄清,谢谢。
我认为这是问题的根源...catch
块在那里,因为如果找不到指定的元素,FindElement
将抛出异常并且我认为 他只想忽略那些异常。如果是这种情况,那么根本就不应该有return
。但我可能是错的..?
我的假设是 OP 熟悉 selenium,但不熟悉 C#,因此与 selenium 相比,它更多的是调试问题(名称也说明了这一点)【参考方案2】:
您似乎想从多个 XPath(如果找到)中选择一个随机项目并单击它。问题是您调用return;
,而不是忽略异常(不做任何事情),这将退出该方法。
相反,您可以从 catch
块中删除 return
语句,这应该可以解决您的问题。
此外,如果我们将一些结果存储在列表中然后循环遍历这些列表(并从列表中选择一个随机元素),您似乎有很多重复的代码可以简化。另外,你只需要初始化Random
的实例一次。
例如:
// Only initialize random one time
var random = new Random();
// Store our XPaths in a list so we can loop over them
var buttonXPaths = new List<string>
$"//*[@id='root']/div/main/div[2]/div/div[1]/button[1]",
$"//*[@id='root']/div/main/div[2]/div/div[1]/button[2]",
$"//*[@id='root']/div/main/div[2]/div/div[1]/button[3]",
$"//*[@id='root']/div/main/div[2]/div/div[1]/button[4]",
;
// Endless loop
while (true)
// Sleep for half a second
Thread.Sleep(500);
// Create a list to hold any WebElements we find
var elements = new List<WebElement>();
// For each XPath, try to find the element and add it to our list
foreach (var buttonXPath in buttonXPaths)
try
elements.Add(driver.FindElement(buttonXPath));
catch
// Ignore any exceptions. The next line isn't necessary, but I
// included it so you can see the syntax for explicitly skipping
// a loop iteration and starting it over again (you were using 'return')
continue;
// If we found any elements. This is the same as: if (elements.Count > 0)
if (elements.Any())
// Display the number of elements found in a message box
MessageBox.Show(elements.Count.ToString(), elements.Count.ToString());
// Choose a random element from our list
WebElement randomElement = elements[random.Next(elements.Count)];
// Click it
randomElement.Click();
// This was in your code, not sure why
Console.WriteLine($"elements.Count <");
【讨论】:
以上是关于如何防止 C# 和 Selenium 退出代码 0的主要内容,如果未能解决你的问题,请参考以下文章
python selenium如何实现重复执行登陆系统,退出系统的代码
如何防止 Selenium 3.0 (Geckodriver) 创建临时 Firefox 配置文件?
如何使用 Selenium 和 Python 在 Python 类中调用方法