将函数和基本测试分离到两个cs文件中

本文关键字:两个 cs 文件 函数 分离 测试 | 更新日期: 2023-09-27 18:11:02

我想为我所有的测试项目创建全局cs文件,以保持我所有的常量和函数。例如,这个文件用于不同的测试global.cs:

namespace SeleniumTests
{ 
    Public class forAllTests
    {
        //....
        public void Login()
        { 
            wait.Until<IWebElement>((d) => { return d.FindElement(By.Id("login")); });
            driver.FindElement(By.Id("login")).SendKeys("login");
            wait.Until<IWebElement>((d) => { return d.FindElement(By.Id("password")); });
            driver.FindElement(By.Id("password")).SendKeys("password");
        }
    }
}
例如另一个文件program。cs
namespace SeleniumTests
{ 
    Public class Test
    { 
        forAllTests.Login();
        //.....
    }
}

可能还是不可能?

乌利希期刊指南。

谢谢你的回答。是的,我想要更具体的建议。我正在测试Firefox、Chrome和Safari。我知道页面对象模式,我正在使用它。比如我写的一些代码。所以这里的一些代码(部分3* 4* -不工作,并希望使他们正确,请帮助我)。它现在是如何工作的:1* Program.cs——

       using System;
        using System.Web;
        using System.Text;
        using System.Text.RegularExpressions;
        using System.Threading;
        using NUnit.Framework;
        using OpenQA.Selenium;
        using OpenQA.Selenium.Chrome;
        using OpenQA.Selenium.Safari;
        using OpenQA.Selenium.Firefox;
        using OpenQA.Selenium.Support.UI;
        using OpenQA.Selenium.Support.PageObjects;
        using System.Diagnostics;
        using System.Threading;
        using Microsoft.Office.Interop.Excel;
        using Excel = Microsoft.Office.Interop.Excel;
        using System.Web;
        using System.Linq;
        using System.Windows.Forms;
        using System.IO;
        using System.Windows.Controls;


         namespace SeleniumTests
            {
                [TestFixture]
                public class Auth01
                {
                    private bool acceptNextAlert = true;
                    private LoginPage loginPage;
                    private PatientsPage patientsPage;        
                    private MainViewPage mainViewPage;
                    private EmkPage emkPage;
                    private IWebDriver driver;
                    private StringBuilder verificationErrors;
                    private string baseURL;                      
                    string drop_down_id;
                    string drop_down_text;
                    string url1;
                    string url2;
                    string now1;

                    [SetUp]
                    public void SetupTest()
                    {
                        driver = new FirefoxDriver();
                        driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
                        baseURL = "http://....";
                        driver.Navigate().GoToUrl(baseURL + Constants.startUrl);
                        // driver.Manage().Window.Maximize();
                        loginPage = new LoginPage();
                        PageFactory.InitElements(driver, loginPage);
                        verificationErrors = new StringBuilder();
                    }

                     public void login()
                    {
                        WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
                        loginPage.Login.Clear();
                        loginPage.Login.SendKeys("login");
                        loginPage.Password.Clear();
                        loginPage.Password.SendKeys("password");
                        IWebElement myDynamicElement = wait.Until<IWebElement>((d) => { return d.FindElement(By.CssSelector(loginPage.enterbuttonPublic)); });
                        loginPage.EnterButton.Click();
                    }
        public void drop_down()
                    {
                        IWebElement elem = driver.FindElement(By.Id(drop_down_id));           
                        var options = elem.FindElements(By.TagName("option"));
                        string opt;
                        string value;
                        string x;
                        foreach (IWebElement option in options)
                        {
                            opt = option.Text;
                            value = option.GetAttribute("value");
                            if (drop_down_text.Equals(opt))
                            {
                                x = "//select[@id='" + drop_down_id + "']/option[@value='" + value + "']";
                            }
                        } 
                    }

                    [TearDown]
                    public void TeardownTest()
                    {
                        try
                        {
                            driver.Quit();
                        }
                        catch (Exception)
                        {
                        } Assert.AreEqual("", verificationErrors.ToString());
                    }
                    [Test]
                    public void The0Auth01Test()
                    {
                        Stopwatch stopWatch = new Stopwatch();
                        stopWatch.Start();
    login();
                     //.....
    drop_down_id="id";
    drop_down_text = "text";
    drop_down();
    //...
    stopWatch.Stop();
    } 
 static void Main()
        {
            Auth01 Auth01_1 = new Auth01();
            Auth01_1.SetupTest();
            Auth01_1.The0Auth01Test();
        }

2* AllAuth.cs——//所有测试

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.IE;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium.Support.PageObjects;
using System.IO
;

namespace SeleniumTests
{
 public class LoginPage
    {

        private IWebDriver driver;
        const string login = "USERNAME";  
        public string loginPublic = login;
        [FindsBy(How = How.Id, Using = login)]  
        public IWebElement Login { get; set; }
        const string password = "PASSWORD";  
        public string passwordPublic = password;
        [FindsBy(How = How.Id, Using = password)]  
        public IWebElement Password { get; set; }
        const string enterbutton = "button.button-gray"; 
        public string enterbuttonPublic = enterbutton;
        [FindsBy(How = How.CssSelector, Using = enterbutton)]
        public IWebElement EnterButton { get; set; }
        const string notification = "#notification-message";  
        public string notificationPublic = notification;  
         [FindsBy(How = How.CssSelector, Using = notification)]
        public IWebElement Notification { get; set; }
        const string body = "BODY";    
        public string bodyPublic = body;
        [FindsBy(How = How.CssSelector, Using = body)]
        public IWebElement Body { get; set; }
        public LoginPage() { }
        public LoginPage(IWebDriver driver)
        {
            this.driver = driver;

            if (!driver.Url.Contains("http:..."))
            {
                throw new StaleElementReferenceException("This is not the login page");
            }
            PageFactory.InitElements(driver, this);
        }
    }

3* And I dream about:

AllAuth.cs——

///...
namescpace SeleniumTests 
{
/////.....
public class Fantasy
{
 private IWebDriver driver;
login()
{
//....
}
drop_down()
{
//...
}
}
}

4* Program.cs——

///...
    namescpace SeleniumTests 
    {
    /////.....
 [Test]
                    public void The0Auth01Test()
                    {
fantasy.login();
fantasy.drop_down();
}
///...
}

将函数和基本测试分离到两个cs文件中

当然有可能。Selenium只是一个通过WebDriver.dll访问的API,用来驱动浏览器。您想要使用的任何编码结构都可以很容易地用于此。我曾经为一家公司做过一个7层的版本,看到很多人只写1层、2层或3层。

问题是什么对你的组织是最好的。例如……如果你使用一个特定的UnitTest框架,那么你的"测试"将全部存在于一个单元测试项目中,并引用你的核心功能,类似于API层。我建议至少将其合并,因为在您的应用程序中重复用于公共控件的代码对于可维护性和最佳实践来说确实很差。

以上是图层而不是文件。除非您总共只有5个测试,否则将所有内容放入一两个文件中是非常不切实际和难以维护的。我强烈建议使用通用的编码标准和实践来进行Selenium测试,就像使用常规的c#代码一样。下面的链接是c#的,因为它被标记为c#。

命名规范:http://msdn.microsoft.com/en-us/library/ff926074.aspx

框架指南:http://msdn.microsoft.com/en-us/library/ms229042.aspx

标准指南:http://blogs.msdn.com/b/brada/archive/2005/01/26/361363.aspx

如果你谷歌一下,会有更多…如果你想要更具体的建议,请在你的问题中添加更多细节,说明你的项目是什么,有多少测试,web应用程序类型的细节,支持多少种不同的浏览器类型,它是否支持手机,数据库使用情况,团队规模等。一个好的设计

更新:看起来你在正确的道路上,但你需要设置你的驱动程序并将其传递给函数…或者使用对所有人都相同的公共/受保护变量。你现在的方式看起来就像每次你调用一个单独的函数/方法时都会启动一个新的驱动程序,这当然是行不通的。

因此,将您的设置放在测试文件(#3)的顶部,并在(#4)中添加单个测试方法到"setup"。当(#4)第一个测试被调用时,设置将实例化您的驱动程序并将其保存在(#3)中。然后将该驱动程序变量传递到(#3->#2)上的所有函数中,以便它们在同一个驱动程序实例上执行。实际的设置调用应该在(#3)中,但与fantasy.setup()类似;(# 4)。类似地,当你更新你的页面对象时,你将现有的驱动程序传递给它,并用新的页面对象覆盖现有的页面对象…除非你想保留一堆不同的页面……注意内存使用情况。这将允许您的方法完全不必担心驱动程序处理。这也将允许您启动多个测试线程,每个线程将维护自己的驱动程序。然后当你调用fantasy.login();它将转到(#3)中的方法并调用(#2)方法,并将私有驱动程序从(#3)中的内存传递到(#2)方法以执行。