如何防止 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 配置文件?

c#编写的软件如何多开

如何使用 Selenium 和 Python 在 Python 类中调用方法

Selenium : 请保护 ChromeDriver 和相关测试框架使用的端口,防止恶意代码访问

Selenium WebDriver - 如何使用 C# 设置页面加载超时