За пределами pageobject

Download За пределами PageObject

If you can't read please download the document

Upload: automated-testinginfo

Post on 29-Nov-2014

1.962 views

Category:

Technology


8 download

DESCRIPTION

За пределами PageObject, Дмитрий Жарий Есть ли необходимость в использовании объектно-ориентированного подхода в автоматизации тестирования? Нужно ли нам экономить исходный код, или лучше скопировать, вставить и подправить? Что лучше, “сложное” ООП или простые “дубовые” тесты. Ответ зависит от Вашего проекта автоматизации и от дальнейших планов его развития. Если Вы планируете остановится на десятке тестов, то в таком случае в “более сложных практиках” необходимости нет. Если же Вы планируете долгосрочное развитие фреймворка автоматизации, то задуматься о правильной архитекторе и будущем росте необходимо уже прямо сейчас. В своем докладе Дмитрий расскажет, как очень несложные практики ООП помогут сделать код еще проще и понятней. И поверьте, в хорошем коде может разобраться любой человек, а горы “вечно падающего копи-паста” будут просто ненавидеть. Также Дмитрий расскажет о том, как Автоматизация может тестировать сама себя при помощи легких UI тестов перед тем, как запустить более тяжелые функциональные тесты и сценарии. Он покажет, как написав код тестового набора всего лишь один раз, применить его для каждой страницы отдельно. Примеры кода к докладу будут на C#/.NET. Но, любую такую практику можно реализовать на любом общеизвестном и популярном языке программирования.

TRANSCRIPT

  • 1. PageObject atdays.com
  • 2. ! atdays.com #atdays 2
  • 3. [OK]=================================================1. PageObject2. PageObject3. PageObject , !4. PageObject5. PageObject6. : .Invoke() IHaveExpectedControls atdays.com #atdays 3
  • 4. PAGE OBJECT?atdays.com #atdays 4
  • 5. . public void Wikipedia_Smart_Search_Test(){ RemoteWebDriver driver = new InternetExplorerDriver(); driver.Navigate() .GoToUrl("http://en.wikipedia.org/wiki/Main_Page"); driver.FindElementByCssSelector(@"div#simpleSearch") .SendKeys("Webdriver Selenium"); Assert.AreEqual("http://en.wiki {...} Driver" , driver.Url);}atdays.com #atdays 5
  • 6. . atdays.com #atdays 6
  • 7. atdays.com #atdays 7
  • 8. ? driver.FindElement(By.XPath("//a[text()=Log On]")) .Click(); // Click on the Log On link. var logOnLink = driver.FindElement( By.XPath("//a[text()=Log On]")); logOnLink.Click();atdays.com #atdays 8
  • 9. , atdays.com #atdays 9
  • 10. PAGE OBJECT!atdays.com #atdays 10
  • 11. var ddlMonthSelect = new SelectElement(driver.Fin , ! dElementByName(@"EXPIRYD ATE_MM")); var ddlYearSelect = new SelectElement(driver.Fin dElementByName(@"EXPIRYD ATE_YY")); var txtSecurityCode = driver.FindElementByName (@"CVV"); var btnContinue = driver.FindElementById(" btnSubmit"); ddlMonthSelect.SelectByT ext("05"); ddlYearSelect.SelectByTe xt("15");atdays.com #atdays 11
  • 12. "-" - , div spanatdays.com #atdays 12
  • 13. PageObject Pages LoginPage Login(name, passwd) MainPage LogOut() GotoProjects() GotoUserProfile() Search(text)atdays.com #atdays 13
  • 14. PAGE OBJECT atdays.com #atdays 14
  • 15. PageObject : , atdays.com #atdays 15
  • 16. PageObject / , atdays.com #atdays 16
  • 17. MainPage Create Account Pageatdays.com #atdays 17
  • 18. !atdays.com #atdays 18
  • 19. ? PAGE OBJECT!atdays.com #atdays 19
  • 20. 01: public static RemoteWebDriver Driver { get { return WebBrowser.Driver; } }[TestMethod]public void Donate_test_static(){ MyPages.MainPage.Open(); MyPages.MainPage.GoToDonatePage(); MyPages.DonatePage.Donate_50_UAH_Using_Debit_Card(); MyPages.DonationPaymentsForm.FillDonationForm ( firstName : "Vasya", lastName : "Pupkin", securityCode : "555" ); // CUT}atdays.com #atdays 20
  • 21. 2: atdays.com #atdays 21
  • 22. 3: Driver !public static class WebBrowser{ public static RemoteWebDriver _driver = null; public static RemoteWebDriver Driver { get { _driver = _driver ?? new InternetExplorerDriver(); return _driver; } }} public static RemoteWebDriver Driver { get { return WebBrowser.Driver; } }atdays.com #atdays 22
  • 23. () WebBrowser. MyPages.* atdays.com #atdays 23
  • 24. C# class static class . Webdriver " ", PageFactory atdays.com #atdays 24
  • 25. . PAGE OBJECT OBJECTatdays.com #atdays 25
  • 26. ! , MyPagesatdays.com #atdays 26
  • 27. MyPagespublic static class MyPages{ public static MainPage MainPage { get { return new MainPage();} } public static DonatePage DonatePage { get { return new DonatePage(); } }}atdays.com #atdays 27
  • 28. Object Staticatdays.com #atdays 28
  • 29. AbstractPageBasepublic abstract class AbstractPageBase{ public RemoteWebDriver Driver { get { return WebBrowser.Driver; } }}atdays.com #atdays 29
  • 30. PaymentResultPagepublic class PaymentResultPage : AbstractPageBase{ public void WaitUntilExists() { WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(30)); wait.Until(ExpectedConditions.TitleContains( @"Donate-error - Payments")); } public string GetResultHeaderText() { var lblFirstHeader = Driver. FindElementById(@"firstHeading"); return lblFirstHeader.Text; }}atdays.com #atdays 30
  • 31. Changelog AbstractPageBase MyPages.* - MyPages !atdays.com #atdays 31
  • 32. / atdays.com #atdays 32
  • 33. () ()atdays.com #atdays 33
  • 34. http://bash.im/quote/420885xxx: " RE: FW: FW: RE: RE: FW: RE: !!!!!!"yyy: /CHAIN OF RESPONSIBILITY/ atdays.com #atdays 34
  • 35. Chain of Responsibility ?? ? ??? ????atdays.com #atdays 35
  • 36. Iinvokablepublic interface IInvokable{ void Invoke(); bool Exists();} Invoke Invokable , I invokable (-, -)!atdays.com #atdays 36
  • 37. Page.Invoke():Page.Invoke(): Exists() ! Exists(), : Page.Invoke() - ! Donation Donate Payments Page Formatdays.com #atdays 37
  • 38. Iinvokable? var page = MyPages. PaymentResultErrorInvalidCreditCard; page.Invoke();atdays.com #atdays 38
  • 39. Iinvokable? public void TestThatPageExists(IInvokable page){ page.Invoke(); Assert.IsTrue(page.Exists());}[TestMethod]public void Test_PaymentResultErrorInvalidCreditCard(){ TestThatPageExists( MyPages.PaymentResultErrnvalidCreditCard );}atdays.com #atdays 39
  • 40. Iinvokable? ( ) public void Invoke() { if (Exists() == false) { var mainPage = MyPages.MainPage; mainPage.Invoke(); mainPage.GoToDonatePage(); } }atdays.com #atdays 40
  • 41. I HAVE EXPECTED CONTROLSatdays.com #atdays 41
  • 42. , ? public interface IHaveExpectedControls : IInvokable { List GetExpectedControls(); } .Invoke() .Exists() .GetExpectedControls()atdays.com #atdays 42
  • 43. Get Expected Controls (PageObject)public class DonatePage : AbstractPageBase, IHaveExpectedControls{ [FindsBy(Using=@"input[name=amount][value=50]", How = How.CssSelector)] public IWebElement rbtnDonate50; [FindsBy(Using=@"input[value=Donate by credit/debit card]", How = How.CssSelector)] public IWebElement btnMakeDonation; public List GetExpectedControls() { return new List() { rbtnDonate50, btnMakeDonation }; } atdays.com #atdays 43
  • 44. public virtual IHaveExpectedControls CurrentPage{ get { return null; }}[TestMethod]public void TestExpectedControls(){ CurrentPage.Invoke(); var expectedControls = CurrentPage.GetExpectedControls(); foreach (var expectedControl in expectedControls) { Assert.IsTrue(expectedControl.Displayed); }}atdays.com #atdays 44
  • 45. - -? , : 1. 2. -atdays.com #atdays 45
  • 46. !atdays.com #atdays 46
  • 47. : , : ! Invoke() : atdays.com #atdays 47
  • 48. , : ! atdays.com #atdays 48