在c#中对多个测试使用pageObject



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

在测试中,我做了以下操作:

  1. 在第一次测试中使用LoginPage登录到网站。成功登录将浏览器url更改为主页
  2. 在第二个测试中,创建一个名为PaymentObj的pageObject实例,并进行支票支付。
  3. 在第三个测试中,再次创建名为PaymentEcheck的pageObject实例,并进行Echeck支付。

当我执行第一个&第二次测试它工作得很好当我执行第一个&第三次测试它工作得很好但如果我试着一次跑完三个,那么第三个就失败了。它无法定位页面元素(PaymentECheck.A_selectPayMode("ECH");这行报告无法定位元素) .

我创建了3个独立的测试,登录将只做一次,我可以测试任何顺序的任何支付方式。代码附在

下面
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();
        }
    }
}

你能让我知道为什么第三个测试失败时,我试图运行所有的测试在一次去?

您的测试应该是相互独立的,并且能够以任何顺序一起或单独运行,看起来实际情况并非如此。我猜你正在使用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 */
}
重要的是要注意,创建Page Object的实例并不一定意味着浏览器被导航到该页面(除非这是在构造函数中完成的)。正如Arran所说,调试你的代码,确保你实际上是在你认为你应该在每个测试的页面

在搜索了更多的问题后,我发现了selenium错误3719,其中显示

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

这是Selenium 2.39中的一个bug。2014年2月19日发布的新版本2.40修复了此问题。

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

最新更新