ãã¹ãèªååã¯ãéçºãšãã¹ããšãã2ã€ã®åéã®åºäŒãã®å Žã§ãã ãããã£ãŠãããããããã®æ
£è¡ã¯é£ãããèå³æ·±ããã®ã ãšèããŠããŸãã
è©Šè¡é¯èª€ãéããŠã次ã®æè¡çã¹ã¿ãã¯ã«å°éããŸããã
- SpecFlowïŒãªãã·ã§ã³ïŒïŒDSL
- NUnitïŒãã¹ããã¬ãŒã ã¯ãŒã¯
- PageObject + PageElementsïŒUIã®æœè±¡å
- ã³ã³ããã¹ãã®ãã¹ãïŒã¿ãŒã²ããç°å¢ãã·ã¹ãã ãŠãŒã¶ãŒã«é¢ããæ
å ±ïŒ
- Selenium.WebDriver
ã¹ã±ãžã¥ãŒã«ããããã¹ããå®è¡ããã«ã¯ãTFS 2012ãšTeamCityã䜿çšããŸãã
ãã®èšäºã§ã¯ãããã«ã©ã®ããã«ãªã£ãã®ããå
žåçãªãšã©ãŒãšãããã解決ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ãªããããªã«é£ããã®ïŒ
æããã«ããã¹ãèªååã«ã¯å€ãã®å©ç¹ããããŸãã èªåãœãªã¥ãŒã·ã§ã³ïŒ
- æéãç¯çŽ
- ãã¹ãæã«äººçèŠå ãæé€
- å®æçãªååž°ãã¹ãã®è² æ
ã軜æž
èªåãã¹ããè¡ã£ãããšããã人ãªã誰ã§ããã³ã€ã³ã®è£åŽã«ã€ããŠç¥ã£ãŠããŸãã èªåãã¹ãã«ã¯æ¬¡ã®ãã®ããããŸãã
- UIã®å€æŽã«ããè匱ã§ãç Žæã
- ãããã«ããããææã®äººãšãã®ã³ãŒããå«ã
- ç¡å¹ïŒäžæ£ãªåäœããã¹ãããããç°å¢ã«äŸåããŸã
ããšãã°ã次ã®ã³ãŒããèããŸãã ååã§èŠããšããæ±åã¹ã¿ã€ã«ãã®ãªã¯ãšã¹ãã«å¿ããŠãGoogleãéåœã®äººæ°ã¢ãŒãã£ã¹ãPSYã®YouTubeãã£ã³ãã«ã«æåã®çµæãæäŸãããšããäºå®ããã¹ãããŠããããšãããããŸãã
[Test] public void Google_SearchGangnamStyle_PsyYouTubeChanelIsOnTop() { var wd = new OpenQA.Selenium.Firefox.FirefoxDriver {Url = "http://google.com"}; try { wd.Navigate(); wd.FindElement(By.Id("gbqfq")).SendKeys("gangnam style"); wd.FindElement(By.Id("gbqfb")).Click(); var firstResult = new WebDriverWait(wd, TimeSpan.FromSeconds(10)).Until( w => w.FindElement(By.CssSelector("h3.r>a"))); Assert.AreEqual("PSY - YouTube", firstResult.Text); Assert.AreEqual("http://www.youtube.com/user/officialpsy", firstResult.GetAttribute("href")); } finally { wd.Quit(); } }
ãã®ãã¹ãã«ã¯å€ãã®åé¡ããããŸãã
- ã·ã£ããã«ãããã¢ããªã±ãŒã·ã§ã³ã¬ã€ã€ãŒïŒãã©ã€ããŒããã±ãŒã¿ãŒãçµæïŒ
- ãã¹ãã§ç·ãçž«ããã
- IEãªã©ã§Webãã©ã€ããŒãå€æŽããã«ã¯ããã¹ãŠã®ãã¹ããå€æŽããå¿
èŠããããŸã
- ãã±ãŒã¿ãŒã¯ãã¹ãã§é
ç·ãããåãã¹ãã§å床è€è£œãããŸã
- Webãã©ã€ããŒäœæã³ãŒãã®è€è£œ
- ãšã©ãŒã¡ãã»ãŒãžã䌎ããªãã¢ãµãŒã
- æåã®ã¢ãµãŒãããèœã¡ããå Žåã2çªç®ã®æ¡ä»¶ã¯ãŸã£ãããã§ãã¯ãããŸããã
- ãã¹ããäžèŠãããšãäœãèµ·ãã£ãŠããã®ãæ確ã§ã¯ãããŸãããã³ãŒããç解ããæéããããŠã³ãŒããç解ããå¿
èŠããããŸãã
èªååã«ãé¡ã«ãè¿ã¥ããšãåãã¢ã¯ã·ã§ã³ã®ã«ãŒãã³ã®ç¹°ãè¿ããåãé€ãã®ã§ã¯ãªãããã¹ããµããŒãã誀æ€ç¥ãã¹ãã²ããã£ã³ãŒãã§ããã«é çãããŸããèªåãã¹ãã®ã¢ããªã±ãŒã·ã§ã³å±€
ãã¹ããã³ãŒãã§ãã ããããã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããšåãããã«æ±ããŸãã ããžãã¹ã¢ããªã±ãŒã·ã§ã³å±€ã®ããŒãã¯ãã§ã«ååã«ã«ããŒãããŠããŸãã ãã¹ãã§åŒ·èª¿è¡šç€ºã§ããã®ã¯ã©ã®ã¬ã€ã€ãŒã§ããïŒ
- ãã¯ãã«ã«ãã©ã€ããŒïŒWebDriverãSelenium RCãªã©ïŒ
- ã³ã³ããã¹ãã®ãã¹ãïŒã¿ãŒã²ããç°å¢ããŠãŒã¶ãŒãããŒã¿ïŒ
- UIã®æœè±¡å-ããŒãžããŠã£ãžã§ãããããŒãžã³ã³ããŒãã³ãïŒPageObjectãã¿ãŒã³ïŒ
- ãã¹ãïŒãã¹ããã¬ãŒã ã¯ãŒã¯ïŒNUnitãxUnitãMSTestïŒ
- DSL
é²åçãªãã¡ã¯ã¿ãªã³ã°ãå®è¡ãããã¹ããä¿®æ£ããŸãã
ãã¯ãã«ã«ãã©ã€ããŒ
ç§ãã¡ã®å Žåãããã¯Selenium.WebDriverã§ãã WebDriverèªäœã¯ãã¹ãèªååããŒã«ã§ã¯ãªããåãªããã©ãŠã¶ãŒç®¡çããŒã«ã§ãã HTTPãªã¯ãšã¹ãã®ã¬ãã«ã§ãã¹ããèªååããå€ãã®æéãç¯çŽã§ããŸããã WebãµãŒãã¹ããã¹ãããã«ã¯ãWebãã©ã€ããŒã¯ãŸã£ããå¿
èŠãããŸããããããã·ã§ååã§ãã
Webãã©ã€ããŒã䜿çšããããšããå§ãããŸããçç±ã¯æ¬¡ã®ãšããã§ãã
- æè¿ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãåãªãèŠæ±/å¿ç以äžã®ãã®ã§ãã ã»ãã·ã§ã³ãCookieãJavaã¹ã¯ãªãããWebãœã±ããã ãã®ãã¹ãŠãããã°ã©ã ã§ç¹°ãè¿ãã®ã¯éåžžã«å°é£ã§ãã
- ãã®ãããªãã¹ãã¯ããŠãŒã¶ãŒã®è¡åã«ã§ããã ãè¿ããã®ã§ãã
- ã³ãŒãã®èšè¿°ã®è€éãã¯ã¯ããã«äœããªããŸãã
ãã¯ãã«ã«ãã©ã€ããŒã¬ã€ã€ãŒã«ã¯ä»¥äžãå«ãŸããŸãã
- ãã¹ãŠã®Webãã©ã€ããŒèšå®
- Webãã©ã€ããŒã®äœæãšç Žæ£ã®èåŸã«ããããžãã¯
- ãšã©ãŒå¶åŸ¡
å§ããããã«ãèšå®ã§èšå®ãè¡ããŸãã ç§ãã¡ã«ãšã£ãŠã¯ãã®ããã«èŠããŸãïŒ
<driverConfiguration targetDriver="Firefox" width="1366" height="768" isRemote="false" screenshotDir="C:\Screenshots" takeScreenshots="true" remoteUrl="âŠ"/>
æ§æã®èªã¿åããWebãã©ã€ããŒã®äœæãšç Žæ£ã®ããžãã¯ãåŒãåããå¥ã®ã¯ã©ã¹ãäœæããŸãããã
[Test] public void WebDriverContextGoogle_SearchGangnamStyle_PsyYouTubeChanelIsOnTop() { var wdc = WebDriverContext.GetInstance(); try { var wd = wdc.WebDriver; wd.Url = "http://google.com"; wd.Navigate(); wd.FindElement(By.Id("gbqfq")).SendKeys("gangnam style"); wd.FindElement(By.Id("gbqfb")).Click(); var firstResult = new WebDriverWait(wd, TimeSpan.FromSeconds(10)).Until( w => w.FindElement(By.CssSelector("h3.r>a"))); var expected = new KeyValuePair<string, string>( "PSY - YouTube", "http://www.youtube.com/user/officialpsy"); var actual = new KeyValuePair<string, string>( firstResult.Text, firstResult.GetAttribute("href")); Assert.AreEqual(expected, actual); } finally { wdc.Dispose(); } }
å°ãè¯ããªããŸããã ããã§ãåžžã«1ã€ã®Webãã©ã€ããŒã®ã¿ã䜿çšãããããã«ãªããŸããã ãã¹ãŠã®èšå®ã¯æ§æå
ã«ãããããåã³ã³ãã€ã«ããã«ãã©ã€ããŒããã®ä»ã®èšå®ãå€æŽã§ããŸãã
ã³ã³ããã¹ãã®ãã¹ã
ã¢ããªã±ãŒã·ã§ã³ã®ãã©ãã¯ããã¯ã¹ãã¹ãã«ã¯ãäžå®éã®å
¥åããŒã¿ãå¿
èŠã§ãã
- ã¿ãŒã²ããç°å¢-URLããã¹ãæžã¿ã¢ããªã±ãŒã·ã§ã³ã®ããŒã
- ç°ãªã圹å²ã»ãããæã€ãŠãŒã¶ãŒ
ãã®æ
å ±ã¯ãã¹ãããžãã¯ã«ã¯é©çšãããªããããæ§æã»ã¯ã·ã§ã³ã«èšèŒããŸãã æ§æå
ã®ãã¹ãŠã®ç°å¢ã«ã€ããŠèª¬æããŸãã
<environmentsConfiguration targetEnvironment="Google"> <environments> <environment name="Google" app="GoogleWebSite"> <apps> <app name="GoogleWebSite" url="http://google.com/" /> </apps> <users> <user name="Default" login="user" password="user" /> </users> </environment> </environmentsConfiguration>
代ããã«
wd.Url = " google.com "; wd.Url = EnvironmentsConfiguration.CurrentEnvironmentBaseUrl;ã«ãªã
ãŸããã- ãã¹ãŠã®ãã¹ãã§URLãéè€ããããšã¯ãããããŸãã
- å¥ã®ç°å¢ããã¹ãããã«ã¯ãç°ãªãæ§æã§ãããžã§ã¯ããçµã¿ç«ãŠãå€æãè¿œå ããã ãã§ååã§ã
<environmentsConfiguration targetEnvironment="Google-Test" xdt:Transform="SetAttributes">
ããŒãžãªããžã§ã¯ã
ããŒãžãªããžã§ã¯ããã¿ãŒã³ã¯ããã¹ãã®èªååã§å®èšŒãããŠããŸãã
åºæ¬çãªèãæ¹ã¯ãããŒãžã®åäœãããŒãžã¯ã©ã¹ã«ã«ãã»ã«åããããšã§ãã ãããã£ãŠããã¹ãã¯äœã¬ãã«ã®ãã¯ãã«ã«ãã©ã€ããŒã³ãŒãã§ã¯æ©èœãããé«ã¬ãã«ã®æœè±¡åã§æ©èœããŸãã
ããŒãžãªããžã§ã¯ãã®äž»ãªå©ç¹ïŒ
- æš©éã®åé¢ïŒããŒãžã®ãã¹ãŠã®ãããžãã¹ããžãã¯ãã¯ããŒãžãªããžã§ã¯ãã«é
眮ããå¿
èŠããããŸãããã¹ãã¯ã©ã¹ã¯ãããªãã¯ã¡ãœããã®ã¿ãåŒã³åºããçµæã確èªããŸãã
- DRY-ãã¹ãŠã®ãã±ãŒã¿ãŒã¯1ãæã«é
眮ãããŸãã UIãå€æŽãããå Žåã1ã€ã®å Žæã§ã®ã¿ãã±ãŒã¿ãŒãå€æŽããŸã
- ãã¯ãã«ã«ãã©ã€ããŒã¬ã€ã€ãŒãé衚瀺ã«ããŸãã ãã¹ãã¯é«ã¬ãã«ã®æœè±¡åã§æ©èœããŸãã å°æ¥ããã©ã€ããŒãå€æŽãããå ŽåããããŸããããšãã°ãPhantomJSã䜿çšããããããã©ãŒãã³ã¹ãæ¹åããããã«äžéšã®é åã§WebDriverã®äœ¿çšãäžè¬çã«æåŠããŸãã ãã®å ŽåãããŒãžãªããžã§ã¯ãã³ãŒãã眮ãæããã ãã§ãã ãã¹ãã¯å€æŽãããŸãã
- ããŒãžãªããžã§ã¯ãã䜿çšãããšããã±ãŒã¿ãŒã宣èšã¹ã¿ã€ã«ã§èšè¿°ã§ããŸãã
ããŒãžãªããžã§ã¯ãã«æ¬ ããŠãããã®
æ£èŠãã¿ãŒã³ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããŒãžããšã«1ã€ã®ã¯ã©ã¹ãäœæããŸãã ããã¯å Žåã«ãã£ãŠã¯äžäŸ¿ã§ãïŒ
- ã«ã¹ã¿ãã€ãºå¯èœããã³/ãŸãã¯åçã«å€æŽå¯èœãªã¬ã€ã¢ãŠã
- å€ãã®ããŒãžã«ååšãããŠã£ãžã§ãããŸãã¯ãã®ä»ã®èŠçŽ
éšåçã«ã¯ããããã®åé¡ã¯ç¶æ¿ã®å©ããåããŠè§£æ±ºã§ããŸãããæè¡çãªèŠ³ç¹ãšã³ãŒããç解ãã芳ç¹ã®äž¡æ¹ããéçŽãæãŸãããšèããããŠããŸãã
ãããã£ãŠããã¿ãŒã³ã®æ¡åŒµããŒãžã§ã³-ããŒãžèŠçŽ ã䜿çšããããšããå§ãããŸãã ããŒãžèŠçŽ -ããŒãžãå°ããªã³ã³ããŒãã³ãïŒãããã¯ããŠã£ãžã§ãããªã©ïŒã«åå²ã§ããŸãã ãã®åŸããããã®ãããã¯ã¯è€æ°ã®ããŒãžã§åå©çšã§ããŸãã
ããŒãžãäœæããŸãã
[FindsBy(How = How.Id, Using = "gbqfq")] public IWebElement SearchTextBox { get; set; } [FindsBy(How = How.Id, Using = "gbqfb")] public IWebElement SubmitButton { get; set; } public GoogleSearchResults ResultsBlock { get; set; } public void EnterSearchQuery(string query) { SearchTextBox.SendKeys(query); } public void Search() { SubmitButton.Click(); }
ãããŠãçµæãåããããŠã£ãžã§ããã
public class GoogleSearchResults : PageElement { [FindsBy(How = How.CssSelector, Using = "h3.r>a")] public IWebElement FirstLink { get; set; } public KeyValuePair<string, string> FirstResult { get { var firstLink = PageHelper.WaitFor<GoogleSearchResults>(w => w.FirstLink); return new KeyValuePair<string, string>(firstLink.Text, firstLink.GetAttribute("href")); } } }
NuGetã«ã¯ãåªãã
PageFactory.InitElementsã¡ãœãããåããWebDriver.Supportããã±ãŒãžããã
ãŸãããã®æ¹æ³ã¯åªããŠããŸãããå¯äœçšããããŸãã WebDriver.Supportããã±ãŒãžã®
PageFactoryã¯ãããã·ãè¿ããèŠçŽ ãããŒããããã®ãåŸ
ã¡ãŸããã ããã«ããã¹ãŠã®åæã¡ãœããã
Byã¯ã©ã¹ã§æ©èœããå Žåã
FindsByå±æ§ã®äœ¿çšæ¹æ³ã¯ãŸã ããããŸããã
ãã®åé¡ã¯ãåºæ¬ã¯ã©ã¹Pageãäœæããããšã§è§£æ±ºãããŸãã
/// <summary> /// Get Page element instance by type /// </summary> /// <typeparam name="T">Page element type</typeparam> /// <param name="waitUntilLoaded">Wait for element to be loaded or not. Default value is true</param> /// <param name="timeout">Timeout in seconds. Default value=PageHelper.Timeout</param> /// <returns>Page element instance</returns> public T GetElement<T>(bool waitUntilLoaded = true, int timeout = PageHelper.Timeout) where T : PageElement /// <summary> /// Wait for all IWebElement properies of page instance to be loaded. /// </summary> /// <param name="withElements">Wait all page elements to be loaded or just load page IWebElement properties</param> /// <returns>this</returns> public Page WaitUntilLoaded(bool withElements = true)
WaitUntilLoadedã¡ãœãããå®è£
ãã
ã«ã¯ ãFindByå±æ§ãæã€ãã¹ãŠã®ãããªãã¯ããããã£ãåéããWebDriverWaitã¯ã©ã¹ã䜿çšããã ãã§ååã§ãã ãããã®ã¡ãœããã®æè¡çãªå®è£
ã¯çç¥ããŸãã åºåã§ãã·ã³ãã«ã§ãšã¬ã¬ã³ããªã³ãŒããååŸããããšãéèŠã§ãã
var positionsWidget = Page.GetElement<GoogleSearchResults>();
æåŸã®äžäŸ¿ãªã±ãŒã¹ããããŸããã ç¶æ
ã«å¿ããŠããã€ãã®èŠçŽ ãé衚瀺/衚瀺ãããŠã£ãžã§ããããããŸãã ãã®ãããªãŠã£ãžã§ãããããããã1ã€ã®ããããã£ãæã€è€æ°ã®ãŠã£ãžã§ããã«åå²ããããšã¯å®çšçã§ã¯ãããŸããã
解決çãèŠã€ãããŸããã
public static IWebElement WaitFor<TPage>( Expression<Func<TPage, IWebElement>> expression, int timeout = Timeout) var firstLink = PageHelper.WaitFor<GoogleSearchResults>(w => w.FirstLink);
ãããã®æ¹æ³ã®æè¡çãªå®è£
ã¯éå±ããŸããã ãªãã¡ã¯ã¿ãªã³ã°åŸã®ã³ãŒãã®å€èŠ³ãèŠãŠã¿ãŸãããã
[Test] public void Google_SearchGangnamStyle_PsyYouTubeChanelIsOnTop() { try { var page = WebDriverContext.CreatePage<GooglePage>(EnvironmentsConfiguration.CurrentEnvironmentBaseUrl); page.EnterSearchQuery("gangnam style"); page.Search(); var expected = new KeyValuePair<string, string>( "PSY - YouTube", "http://www.youtube.com/user/officialpsy"); var actual = page.GetElement<GoogleSearchResults>().FirstResult; Assert.AreEqual(expected, actual); } finally { WebDriverContext.GetInstance().Dispose(); } }
ãã®æ®µéã§ãã¯ããã«è¯ããªããŸããïŒ
- ãã¹ãã¯ã©ã¹ã¯ãã©ã€ããŒå¶åŸ¡ãæŸæ£ãããããã®è²¬ä»»ãããŒãžã¯ã©ã¹ã«å§ä»»ããŸããã
- ãã±ãŒã¿ãŒã®éè€ãåãé€ããŸãã
- ãã¹ãã®èªã¿ãããã®æ¹å
ãã¹ã
ããŒãžãªããžã§ã¯ãã®ãã±ãŒã¿ãŒãšããžãã¯ãåãåºããåŸããã¹ãã³ãŒãã¯ããç°¡æœã§ç°¡æœã«ãªããŸããã ãã ããããã€ãã®ç¹ã¯ãŸã ããŸãè¯ããããŸããã
- Webãã©ã€ããŒãäœæããããã®ããžãã¯ã¯ããã¹ãããšã«è€è£œãããŸã
- åã¡ãœããã§ããŒãžãäœæããããžãã¯ãåé·ã§ã
- éæ³ã®ç·ããæ±åã¹ã¿ã€ã«ãããPSY-YouTubeãããhttp://www.youtube.com/user/officialpsyãcallused
- ãã¹ãã¹ã¯ãªããèªäœã¯ååã«è匱ã§ããã€ã³ããã¯ã¹äœæã®çµæãå€ããå¯èœæ§ããããããã³ãŒããå€æŽããå¿
èŠããããŸãã
åºæ¬ãã¹ãã¯ã©ã¹ãäœæãã
public class WebDriverTestsBase<T> : TestsBase where T:Page, new() { /// <summary> /// Page object instance /// </summary> protected T Page { get; set; } /// <summary> /// Relative Url to target Page Object /// </summary> protected abstract string Url { get; } [SetUp] public virtual void SetUp() { WebDriverContext = WebDriverContext.GetInstance(); Page = Framework.Page.Create<T>( WebDriverContext.WebDriver, EnvironmentsConfiguration.CurrentEnvironmentBaseUrl, Url, PageElements); } [TearDown] public virtual void TearDown() { if (WebDriverContext.HasInstance) { var instance = WebDriverContext.GetInstance(); instance.Dispose(); } } }
ãã¹ããå床æžãæããŸã
public class GoogleExampleTest : WebDriverTestsBase<GooglePage> { [Test] public void Google_SearchGangnamStyle_PsyYouTubeChanelIsOnTop() { Page.EnterSearchQuery("gangnam style"); Page.Search(); var expected = new KeyValuePair<string, string>( "PSY - YouTube", "http://www.youtube.com/user/officialpsy"); var actual = Page.GetElement<GoogleSearchResults>().FirstResult; Assert.AreEqual(expected, actual); } }
ãã§ã«ã»ãŒå®ç§ã§ãã TestCaseå±æ§ã«éæ³ã®ç·ãå
¥ããŠãã¢ãµãŒãã«ã³ã¡ã³ããè¿œå ããŸã
[TestCase("gangnam style", "PSY - YouTube", "http://www.youtube.com/user/officialpsy")] public void Google_SearchGoogle_FirstResult(string query, string firstTitle, string firstLink) { Page.EnterSearchQuery(query); Page.Search(); var expected = new KeyValuePair<string, string>(firstTitle, firstLink); var actual = Page.ResultsBlock.FirstResult; Assert.AreEqual(expected, actual, string.Format( "{1} ({2}) is not top result for query \"{0}\"", firstTitle, firstLink, query)); }
- ãã¹ãã³ãŒããæ確ã«ãªããŸãã
- ç¹°ãè¿ãæäœã¯åºæ¬ã¯ã©ã¹ã«ç§»åããŸãã
- ãã¹ãã倱æããå Žåããã¹ãã©ã³ããŒã®ãã°ãããã¹ãŠãæ確ã«ãªãããã«ãååãªæ
å ±ãæäŸããŸããã
- TestCaseå±æ§ã䜿çšããŠãã¹ãã³ãŒããå€æŽããã«ãå¿
èŠãªæ°ã®å
¥åããã³åºåãã©ã¡ãŒã¿ãŒãè¿œå ã§ããŸãã
DSL
ãã®ã³ãŒãã«ã¯åé¡ããããŸãïŒ
- ã³ãŒãã¯æ確ã«ãªããŸãããããã®ç¶æ
ãç¶æããã«ã¯ããã¹ãããµããŒãããã¹ãã·ã£ãªã¹ãã®è³æ Œãé©åã§ãªããã°ãªããŸãã
- QAéšéã¯ç¬èªã®ãã¹ãèšç»ãæã£ãŠããå¯èœæ§ãé«ããèªåãã¹ãã¯ãŸã çžé¢ããŠããŸããã
- å€ãã®å Žåãåãæé ãããã€ãã®ã·ããªãªã§äžåºŠã«ç¹°ãè¿ãããŸãã ã³ãŒãã®éè€ã¯ãç¶æ¿ãšéçŽã®å©ããåããŠåé¿ã§ããŸãããç¹ã«ã¹ãããã®é åºãç°ãªãå¯èœæ§ãããããšãèãããšãããã¯ãã§ã«å°é£ãªã¿ã¹ã¯ã®ããã§ã
- Google_SearchGangnamStyle_PsyYouTubeChanelIsOnTopïŒïŒ ïŒ CamelCaseã¯èªã¿ã«ãã
SpecFlowãã©ã°ã€ã³ã䜿çšããŠããããã®åé¡ã解決ã§ããŸãã SpecFlowã§ã¯ãæå®ãããWhen Thenã¹ã¿ã€ã«ã§ãã¹ãã±ãŒã¹ãèšé²ããããããèªååã§ããŸãã
Feature: Google Search As a user I want to search in google So that I can find relevent information Scenario Outline: Search Given I have opened Google main page And I have entered <searchQuery> When I press search button Then the result is <title>, <url> Examples: |searchQuery |title |url |gangnam style |PSY - YouTube |http://www.youtube.com/user/officialpsy [Binding] public class GoogleSearchSteps : WebDriverTestsBase<GooglePage> { [Given("I have opened Google main page")] public void OpenGooglePage() { // Page is already created on SetUp, so that's ok } [Given(@"I have entered (.*)")] public void EnterQuery(string searchQuery) { Page.EnterSearchQuery(searchQuery); } [When("I press search button")] public void PressSearchButton() { Page.Search(); } [Then("the result is (.*), (.*)")] public void CheckResults(string title, string href) { var expected = new KeyValuePair<string, string>(title, href); var actual = Page.GetElement<GoogleSearchResults>().FirstResult; Assert.AreEqual(expected, actual); } }
ãã®ããã«ïŒ
- åã¹ãããã¯1åã®ã¿å®è£
ã§ããŸãã
- When Thenå±æ§ãæ£èŠè¡šçŸããµããŒãããŠããå Žå-åå©çšå¯èœãªãæ©èœãã¹ããããäœæã§ããŸã
- QAéšéã¯èªåãã¹ããããžã§ã¯ãã§ã¹ã¯ãªãããèšé²ã§ããŸã
- ãã¹ã¿ãŒã¯DSLãèšè¿°ã§ããèªååã¯ããã°ã©ããŒã«å²ãåœãŠãããšãã§ããŸã
- ãã€ã§ããåæ Œãããã¹ãã«é¢ããã¬ããŒãããããã£ãŠéçºãããæ©èœã®æ°ãCIãµãŒããŒã§å©çšå¯èœã§ã
ãã®èšäºã§ã¯ãGive When Thenã䜿çšããSpecFlowãšèŠä»¶ç®¡çã«ã€ããŠè©³ããèªãããšãã§ããŸãã
ã¬ã€ãã©ã€ã³ã®èªåå
- å£ããããè€éãªãã±ãŒã¿ãŒãé¿ãã
æ£ãããªãïŒ
[FindsBy(How = How.XPath, Using = "((//div[@class='dragContainer']/div[@class='dragHeader']" + "/div[@class='dragContainerTitle'])[text()=\"Account Info\"])" + "/../div[@class='dragContainerSettings']")] public IWebElement SettingsButton { get; set; }
æ£ããïŒ
[FindsBy(How = How.Id, Using = "gbqfb")] public IWebElement SubmitButton { get; set; }
IDã䜿çšããã®ãæé©ã§ãã java-scriptã¯idã«äŸåããå Žåããããããã³ããšã³ãéçºè
ã¯ãããããå°ãªã確çã§å€æŽããŸãã idïŒåçããŒã¯ã¢ããïŒã䜿çšã§ããªãå Žåãdata-aidïŒautomation-idïŒããŸãã¯åæ§ã®å±æ§ã䜿çšããŸã
- LogonPageãRegistrationPageãHomePageãOrderPageãªã©ã®ããŒãžã¯ã©ã¹ã§ã¢ããªã±ãŒã·ã§ã³ããžãã¯ãã«ãã»ã«åããŸãã
- ããŠã£ãžã§ãããïŒããŒãžèŠçŽ ïŒã§ãŠã£ãžã§ãããšç¹°ãè¿ããããã¯ãéžæããŸããäŸïŒããããŒãããã¿ãŒãLogonLogoff
- 衚瀺ã«å¿ããŠèŠçŽ ããŠã£ãžã§ããã«ã°ã«ãŒãåããŸããäŸïŒConfirmationPopupãEditPopupãAddPopup
- ãã¹ãã³ãŒãå
ã®éæ³ã®è¡ãé¿ããããŒãžããŠã£ãžã§ããã®ããããã£ããŸãã¯OrderSuccessMessageãRegistrationSuccessMessageãInvalidPasswordMessageãªã©ã®ãã«ããŒã«é
眮ããŸãã ããã«ãããèŠçŽ ã®ããŒã/åºçŸãåŸ
æ©ããäžèŠãªã³ãŒããåé¿ãããŸãã
- åºæ¬ãã¹ãã¯ã©ã¹ã«å¯ŸããŠç¹°ãè¿ãæäœãè¡ããSetUpãTearDownã䜿çšããŸãããã©ã€ããŒã®äœæãšç Žæ£ããšã©ãŒã®ããã¹ã¯ãªãŒã³ã·ã§ããã®äœæãèªèšŒããã¹ãã®å¯èªæ§ã®åäž
- å¥ã®ã¢ã»ã³ããªã§ããŒãžãªããžã§ã¯ããåãåºããŸããããã«ããããŠã£ãžã§ãã/ããŒãžã®éè€ãåé¿ã§ããŸãã ãã¹ãä»ãã®ã¢ã»ã³ããªãå€æ°ååšããå¯èœæ§ããããŸã
- ã¢ãµãŒãã¯ãã¹ãã³ãŒãã§ã®ã¿äœ¿çšããããŒãžããŠã£ãžã§ããã«ã¯ã¢ãµãŒããå«ããªãã§ãã ãã
- ãã¹ã察象ãæããã説æããã¢ãµãŒãã䜿çšããŸãã ããã«ããããã¹ãã®å¯èªæ§ãåäžããŸãã
æ£ãããªãïŒ
var actual = Page.Text == âSuccessâ Assert.IsTrue(actual);
æ£ããïŒ
Assert.AreEqual(MessageHelper.Success, Page.Text)
- ã¢ãµãŒããšã©ãŒã¡ãã»ãŒãžã䜿çšãã
Assert.AreEqual(MessageHelper.Success, Page.Text, âRegistration process is not successfullâ);
- é
ç®ãããŒãããããã®ã¿ã€ã ã¢ãŠããšããŠThread.Sleepã䜿çšããªãã§ãã ããã å¿
èŠãªDOMèŠçŽ ã®èªã¿èŸŒã¿ãä¿èšŒããé«ã¬ãã«ã®æœè±¡åã䜿çšããŸããäŸãã°ïŒ
Page.GetElement<GoogleSearchResults>(); var firstLink = PageHelper.WaitFor<GoogleSearchResults>(w => w.FirstLink);
- DSLã䜿çšããªãå Žåã¯ããã¹ãã®ååã[Page_] Script_Expected Behaviorã®åœ¢åŒã§èšè¿°ããŸãã ããã¯ãã©ã®ãããªåäœããã¹ããããŠãããã人ã
ãç解ããã®ã«åœ¹ç«ã¡ãŸãã ããã¯ãèŠä»¶ãå€æŽãããšãã«ç¹ã«éèŠã§ãã
- DSLã§ã¯ãã¹ããããæå³çã«ããŸãã¹ãããã®åå©çšãæ倧åãããããªæ¹æ³ã§ã°ã«ãŒãåãã
æ£ãããªãïŒ
I have logged as a user with empty cart
æ£ããïŒ
I have logged in And my cart is empty
- DSLã§ã¯ã1ã€ã®ã¹ãããã§ã¿ãã«ãæ¯èŒããŸããããã«ããããã¹ããã¯ã©ãã·ã¥ãããšãã«ãããç°¡æœãªã³ãŒããèšè¿°ããããå€ãã®æ
å ±ãååŸã§ããŸãã
æ£ãããªãïŒ
When I open Profile page I can see first name is âPatrickâ And I can see last name is âJaneâ And I can see phone is â+123 45-67-89â
ããã ã
When I open Profile page I can see profile info: Patrick Jane +123 45-67-89
- ãã©ãã¯ããã¯ã¹ãã¹ãã䜿çšãããã¹ãã³ãŒããããã¹ãããŒã¿ã®åæåãè¡ããŸãã ããã«é©ããŠããŸããããšãã°ãSSDTãããžã§ã¯ã
- CIã䜿çšããŠå®æçã«ãã¹ããå®è¡ãããã¹ãçµæãå
¬éããŠæ確ã«ããŸã
ãã¹ãã®èªååã«é¢ããeBayã®éåžžã«åªããã¬ããŒãã¯ã
www.youtube.com /
watchïŒv = tJ0O8p5PajQã«ãããŸãã