在C#中使用pageObject进行多个测试

时间:2014-03-14 11:55:20

标签: c# selenium selenium-webdriver

在我的项目中,我创建了一个名为PostPaymentPage的pageObject,用于处理各种模式的支付,如Check,Echeck等。

在测试中,我执行以下操作:

  1. 在第一次测试中使用LoginPage登录网站。成功登录会将浏览器URL更改为主页
  2. 在第二个测试中,创建一个名为PaymentObj的pageObject实例并进行支票付款。
  3. 在第三次测试中,再次创建名为PaymentEcheck的pageObject实例并进行Echeck付款。
  4. 执行第一个和第一个时使用NUnit第二次测试它工作正常 我执行第一个和第一个时使用NUnit第三次测试它工作正常 但如果我尝试单独运行所有三个,那么第三个失败。它无法找到页面元素(PaymentECheck.A_selectPayMode(" ECH");此行报告找不到元素 )。

    我创建了3个单独的测试,认为Login只会执行一次,我可以按任何顺序测试任何付款方式。代码附在下面

    using System;
    using NUnit.Framework;
    using System.Threading;
    using System.Configuration;
    using OpenQA.Selenium.Support.UI;
    using OpenQA.Selenium;
    
    namespace Billing
    {
        [SetUpFixture]
        class MySetUpClass : SeleniumDriver
        {
            [SetUp]
            public void TestSetUp()
            {
                Visit(ConfigurationManager.AppSettings["baseURL"] + "/login.aspx");
            }
        }
    
        [TestFixture]
        class PostPayment : SeleniumDriver
        {
            private LoginPage loginpage = new LoginPage(WebDriver);
    
            private string baseUrl = WebDriver.Url;
    
            [TestFixtureTearDown]
            public void FixtureTearDown()
            {
                if (WebDriver != null) WebDriver.Quit();
            }
    
            [Test]
            public void _login()
            {
                loginpage.EnterUserName(ConfigurationManager.AppSettings["loginUserName"]);
                loginpage.EnterPassword(ConfigurationManager.AppSettings["loginPassword"]);
                loginpage.Login();
                baseUrl = loginpage.getUrl();
                loginpage.printUrl();
            }
    
            [Test]
            public void MakePaymentByCheck()
            {
                PostPaymentCheckPage PaymentObj = new PostPaymentPage(WebDriver);
                PaymentObj.click_AccountMenu();
                baseUrl = PaymentObj.getUrl();    //Storing this url to be used latter
                PaymentObj.A_click_paymentIcon(ConfigurationManager.AppSettings["accountNo"]);
                PaymentObj.A_selectPayMode("CHK");
                PaymentObj.A_selectPaidBy();
                PaymentObj.A_set_CheckNo("12345");
                PaymentObj.A_set_Comments("Auto QA");
                PaymentObj.A_set_Email(ConfigurationManager.AppSettings["email"]);
                PaymentObj.A_set_PayAmount("11");
                PaymentObj.A_click_PaymentButton();
                //PaymentObj.A_click_CloseButton();
            }
    
            [Test]
            public void MakePaymentByECheck()
            {
                 PostPaymentCheckPage PaymentECheck = new PostPaymentPage(WebDriver);
    
                Visit(baseUrl); //webdriver will navigate to this url
                PaymentECheck.A_click_paymentIcon(ConfigurationManager.AppSettings["accountNo"]);
                PaymentECheck.A_selectPayMode("ECH");
                PaymentECheck.A_set_eCheckPaidBy();
                PaymentECheck.A_set_PayAmount("11");
                PaymentECheck.A_set_bankName("QA Bank");
                PaymentECheck.A_set_routingNumber("987654321");
                PaymentECheck.A_set_accountNumber("111222");
                PaymentECheck.A_set_stateECH();
                PaymentECheck.A_set_AptNoECH("098");
                PaymentECheck.A_set_CityECH("QA City");
                PaymentECheck.A_set_zipECH("12345");
                PaymentECheck.A_set_CommentsECH("Auto QA");
                PaymentECheck.A_set_EmailECH(ConfigurationManager.AppSettings["email"]);
                PaymentECheck.A_click_ECheckPaymentButton();
    
            }
    
        }
    
    }
    

    请您告诉我为什么当我尝试一次性完成所有测试时第三次测试失败了?

2 个答案:

答案 0 :(得分:0)

您的测试应该彼此独立,并且能够以任何顺序一起或单独运行,看起来事实并非如此。我认为你正在使用NUnit(根据你的注释判断),我不熟悉NUnit,但我认为你应该更像这样构建你的课程......

[TestFixtureSetUp] 
public void Init()
{ 
    /* Your login functionality. This method is run ONCE, before any [Test] methods */ 
}

[SetUp] 
public void Init()
{ 
    /* Navigate to home page. This method is called before EACH [Test] method, therefore all tests need to expect to start from the same location */ 
}

[Test]
public void MakePaymentByCheck()
{
   /* Navigate to PostPaymentPage and perform test steps */
}

[Test]
public void MakePaymentByECheck()
{
    /* Navigate to PostPaymentPage and perform test steps */
}

重要的是要注意,创建页面对象的实例并不一定意味着浏览器会导航到该页面(除非这是在构造函数中完成的)。正如Arran所说,调试你的代码,确保你实际上在你认为每次测试应该在的页面上

答案 1 :(得分:0)

在搜索到更多问题之后,我发现了硒错误3719,其中列出了

问题#3719:不再重定向Firefox的控制台输出。这个    信息在很大程度上没有被任何人使用,并且实施有一个    从控制台输出流中读取时有机会产生死锁    stdout和stderr。

这是Selenium 2.39中的一个错误。 2014年2月19日发布的新版本2.40已解决此问题。

使用Selenium 2.40解决了我报告的问题