Selen - Best Practices - Seite Objekt-Sprüche & Page Factory
Ich habe die Entwicklung von meinem Projekt seit 1 Jahr von 0. Ich habe ein bestimmtes Niveau erreicht "Wartung" von meinem Rahmen und tests.
Aber, jeden Tag habe ich mehr Zweifel, ob ich mit den guten Praktiken in mein Projekt. Wäre Super wenn jemand erfahrenes Antworten konnte, für ein paar meiner Fragen. Meist habe ich Fragen, die für das Page-Objekt Prasseln und Seite Factory.
Kurze Beschreibung:
Mein Projekt ist ein one-page-basierte Anwendung, geschrieben in C#, angular.js, javascript. Treiber ist eine statische Instanz und es hat einige zusätzliche Methoden(im code unten habe ich nur Karte 2). Jede Seite ist eine statische Instanz initialisiert, die in Seiten-Klasse.
Aufgrund der oben ich habe nicht initialisiert werden die Objekte, die in Prüfungen der Klasse.
Fragen-Liste:
-
Ist es guter Ansatz, um statische Instanz Initialisieren in die Seiten.cs ? Meiner Meinung nach die [Test] mehr redeable, wenn ich dabei bin es so.
-
Was sind die "echten" Vorteilen der Verwendung von PageObject-Bibliothek? Nur die Benennung der Variablen? "[FindsBy(Wie=Wie.Id)]" ?
-
Was sind die "echten" Vorteilen der Verwendung von PageFactory? Weil ich finde nicht alle oder für mein Projekt ist es nutzlos.
In meinem richtigen Projekt habe ich eine Basisklasse, von der untergeordneten Klassen Erben und gemeinsame Methoden für alle Kind-Klassen geschrieben werden, in PageBase.cs. Also ich habe kein problem mit duplizierten code.
Recht, nun habe ich Sie umgesetzt Singleton in jeder Seite, so dass es ähnlich wie das Programm verwendet in folgenden code (der Unterschied ist nur die Art und Weise der Initialisierung der PageObject)
#region Signleton
private static StartPage instance;
private StartPage()
{
}
public static StartPage Instance
{
get
{
if (instance == null)
{
instance = new StartPage();
}
return instance;
}
}
#endregion
- Jedoch in [Test] muss ich den Namen der Variablen "Instanz", und es ist nicht so gut lesbar wie der Ansatz mit der Initialisierung des PageObject-in-Seiten.cs.
Sind Sie damit einverstanden?
Singleton-Instanz
StartPage.Instance.Search();
Konzept der Ansatz:
Browser.cs
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
namespace SeleniumTestFramework
{
public static class Browser
{
public static IWebDriver Driver { get; set; }
public static bool Initialised { get; set; }
public static void Initialize()
{
string chromeDriverDirectory = @"C:\chromedriver_win32";
Driver = new ChromeDriver(chromeDriverDirectory);
Initialised = true;
}
public static void Quit()
{
Driver.Quit();
Initialised = false;
}
}
}
LoginPage.cs
using OpenQA.Selenium;
namespace SeleniumTestFramework.Pages
{
public class LoginPage
{
private IWebElement screenLogin = Browser.Driver.FindElement(By.Id("onScreenLogin"));
public void OpenLoginModal()
{
screenLogin.Click();
}
}
}
LoginModal.cs
using OpenQA.Selenium;
namespace SeleniumTestFramework.Pages
{
public class LoginPage
{
private IWebElement screenLogin = Browser.Driver.FindElement(By.Id("onScreenLogin"));
public void OpenLoginModal()
{
screenLogin.Click();
}
}
}
StartPage.cs
using OpenQA.Selenium;
namespace SeleniumTestFramework.Pages
{
public class StartPage
{
private IWebElement surenameInput = Browser.Driver.FindElement(By.CssSelector(".id_surname_startpage_testId + input"));
private IWebElement searchButton = Browser.Driver.FindElement(By.CssSelector(".search-button.search-customer"));
public void Search()
{
surenameInput.SendKeys("1");
searchButton.Click();
}
}
}
Seiten.cs
namespace SeleniumTestFramework.Pages
{
public static class Pages
{
public static LoginPage LoginPage
{
get
{
var loginPage = new LoginPage();
return loginPage;
}
}
public static LoginModal LoginModal
{
get
{
var loginModal = new LoginModal();
return loginModal;
}
}
public static StartPage StartPage
{
get
{
var startPage = new StartPage();
return startPage;
}
}
}
}
Tests.cs
using NUnit.Framework;
using SeleniumTestFramework;
using SeleniumTestFramework.Pages;
using OpenQA.Selenium.Support.PageObjects;
using System.Threading;
namespace SeleniumTest
{
[TestFixture]
public class Tests
{
[SetUp]
public void Before()
{
if (!Browser.Initialised) Browser.Initialize();
Browser.Driver.Navigate().GoToUrl("http://localhost:8080/client/");
}
[TearDown]
public void After()
{
Browser.Quit();
}
[Test]
public void Test_without_static()
{
LoginPage loginPage = new LoginPage();
loginPage.OpenLoginModal();
LoginModal loginModal = new LoginModal();
loginModal.Login();
StartPage startPage = new StartPage();
startPage.Search();
}
[Test]
public void Test_with_static()
{
Pages.LoginPage.OpenLoginModal();
Pages.LoginModal.Login();
Pages.StartPage.Search();
}
}
}
Es ist eine gute Frage... es ist einfach nicht dazu gedacht, für die Stack-Overflow-Website.
Eine Frage an dich..Wenn es morgen haben Sie Anspruch parallelisieren tests, wie würde u erreichen, wie der ur-browser-Instanz ist eine statische Referenz?? (wink).. Vorschlag immer verwenden, Komposition über Vererbung gibt Ihnen viel mehr Flexibilität als nur die Lesbarkeit
InformationsquelleAutor Arsey | 2015-09-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einiges zu besprechen. Können den Anfang machen.
Nehme ich an, dass es eine Frage des Geschmacks.
Echter Vorteil auf der Seite Objekt-frameworks ist, dass Sie isolieren, Seite spezifische Informationen an einem Ort. Dies macht das finden und pflegen diese Informationen, gerade nach vorne. Code, der Häufig über die Seiten gelegt werden können, die in Helfer-oder Modul-Dateien. Dieser gemeinsame code ist nicht gebunden an die Spezifika einer Seite, so dass dieser gemeinsame code ist nicht betroffen, wenn ein WebElement ist findElement(By) verpasst. Wenn Sie denken, es wäre verrückt, es nicht zu tun auf diese Weise.
PageFactory hat drei Teile. Die ersten beiden sind in der Seite definierte Klasse. Sie sind die @FindBy-Instanzen, die definieren, wie auf das nützliche WebElements definiert, die sich auf dieser Seite. Diese kommen zuerst, die Sie einfach zu finden und zu pflegen. Als Nächstes kommen die tester unterstützt Aktionen definiert als Methoden. Diese Methoden verwenden Sie das @FindBy-Instanzen, die macht Sie unbeeinflusst von änderungen der FindBy-Instanzen.
}
3 (Fortsetzung). Jetzt in der eigentlichen test-script (step-definitions-Datei in der Gurke) Sie rufen diese Aktionen, indem Sie zuerst mithilfe PageFactory initialisiert eine page-Instanz und Aufruf der test-Methoden für die Aktionen, die Sie definiert, gegen die Seite-Instanz. So
Siehe dieses tutorial http://www.intexsoft.com/blog/item/34-selenium-webdriver-page-object-pattern-and-pagefactory.html
InformationsquelleAutor MikeJRamsey56