Seleniumã䜿çšãããã¹ãã1ã€ã ããããšããŸãã äœãäžå®å®ã«ãªããŸããïŒ ã¹ããŒãã¢ããããæ¹æ³ã¯ïŒ 次ã«ã2ã€ã®ãã¹ããããããšãæ³åããŠãã ããã ä»çŸãæ³åããŠãã ããã ãã®ãããªäžé£ã®ãã¹ãããã°ãã解決ããæ¹æ³ã¯ïŒ ãã¹ãã®æ°ãå¢ãç¶ãããšã©ããªããŸããïŒ
ãã®èšäºã§ã¯ãSimon Stewartãã1ã€ã®ãã¹ãããæ°çŸã®ãã¹ãã䞊è¡ããŠå®è¡ãããšãããé£ããã¹ã±ãŒãªã³ã°ã®æ¹æ³ã説æããŸãã ãã®å Žåã«çºçããåé¡ãããã³ãããã®åé¡ã解決ããããã®å®çšçãªæ¹æ³ã«ã€ããŠç¥ããŸãã Javaã³ãŒããšããã¹ãã€ã³ãã©ã¹ãã©ã¯ãã£ã®éçºã«é¢ããããã€ãã®èãããããŸãã
ãã®èšäºã®ãããã¿ã€ãã¯ãã¢ã¹ã¯ã¯ã®ãã€ãŒã³ãã°2017ã§ã®Simon Stewartã«ããã¬ããŒãã§ãã ãµã€ã¢ã³ã¯WebDriverã®äœæè
ã§ããWebDriverã¯ãã»ãŒ11幎åã®æè¡ã§ãã 圌ã¯çŽ9幎åã«Seleniumãããžã§ã¯ããããŒãžã£ãŒã«ãªããŸããã Googleã§ã圌ã¯ã€ã³ãã©ã¹ãã©ã¯ãã£äžã§æ¯æ¥æ°äžããæ°çŸäžã®ãã¹ãã«Seleniumãæ¡åŒµããããšã«åŸäºããŠããŸããã ããããFacebookã«è¡ããŸããã 圌ã¯çŸåšãW3Cãã¹ãããã³èª¿æŽã°ã«ãŒãã®äžéšã§ããW3Cã®WebDriver仿§ãéçºããŠããŸãã WebDriverã«åºã¥ããŠãæšæºãäœæãããŠãããšèšããŸãã
èšäºã®éçšã§ãç°¡åãªãã¹ããæ€èšãããããã©ã®ããã«ã¹ã±ãŒãªã³ã°ã§ãããã瀺ããããšæããŸãã ãŸããããŒãœãã«ã©ãããããã§èµ·åããæçµçã«ã¯ã¯ã©ãŠãã§åäœããåšå²ã®ãã¹ãŠã®äººã®æ³ååãé©ãããŸãã äžåžã¯ããããå·ã€ããŠãç§ã¯æããã«ããªãã«ååãªãéãæã£ãŠããªãããšèšãã§ããã ã ãã®ããã«ãœãããŠã§ã¢ãäœæããŸãã
ãŸããæ±ºå®ããŸããã-ãªããã¹ããå¿
èŠãªã®ã§ããïŒ ç§ãã¡ã¯ç·ïŒãŸãã¯èµ€ïŒã®è²ã奜ãã ããã§ã¯ãªããç§ãã¡ã®äœåã奜ãã ããã§ããããŸããã å¯äžã®æ©èœã¯ããœãããŠã§ã¢ãæå³ãããšããã«æ©èœããããšã確èªããããšã§ãã ãšã³ãããŒãšã³ãã®ãã¹ãïŒäŸïŒã»ã¬ã³ïŒã¯ããã©ã³ã¹ã®åãããã¹ããã€ãšããã®äžéšã§ããå¿
èŠããããŸãã ããã以å€ã«äœãæ¶è²»ãããªããã°ãããããè¯ããã®ã¯äœãçãŸããŸããã ãã ããããã«ã€ããŠã¯åŸã§èª¬æããŸãã

IDEã§éãããŠããç°¡åãªäŸããå§ããŸãããã ããã¯longAndWrong()
ãšåŒã°ããããããã¹ãã®æ¹æ³ã§ãã å®è¡ãããŒã«ã«ã§å®è¡ãããããã«ãæ°ããFirefoxDriver
ãäœæããŠããŸãã æ¬¡ã«ã WebDriverWait
æç€ºçãªåŸ
æ©ãäœæããŸãã ãã®åŸã http://localhost:8080
ã«ç§»åããé»åã¡ãŒã«ã¢ãã¬ã¹ãšãã¹ã¯ãŒããå
¥åãããtodoã®äœæãèŠçŽ ãäœæããããŸã§åŸ
ã£ãŠãæåŸã«ã¯ãªãã¯ããŸãã 誰ããSeleniumã®ãªãªãŒã¹ãèŠãŠããŸãããããã®ç¹å®ã®ã³ãŒãã«ç°åžžã¯ãããŸããã
ãã®ãã¹ãã¯ã²ã©ãã§ãã çç±ãèŠãŠã¿ãŸãããã ãŸã第äžã«ã圌ã¯å¹žéã®ããã«åããŠããŸãã ããŒãžãåãåã£ãåŸãå
¥åãè¡ãããèŠçŽ ã衚瀺ããããŸã§åŸ
æ©ããŸããã ãããã£ãŠãWebDriverãããŒãžã®ããŒãæéãæ£ããæšæž¬ããããšãæåŸ
ãããŸãã äžèšã®äŸã§ã¯ãHTMLã衚瀺ãããã ããªã®ã§ããã®ã¢ãããŒãã¯æ©èœããŸãããä»ã®å Žåã«ã¯åé¡ãçºçããŸãã
ããã«éèŠãªã®ã¯ãã³ãŒãã®å¥ã®ã»ã¯ã·ã§ã³ã§èŠãçæ°ã§ãïŒ driver.findElements(By.tagName("button")).stream()
ãªã©ã ãã£ã«ã¿ãªã³ã°ãçºçããäœãèŠã€ãããªãå Žåã¯ãäœããã®çç±ã§AssertionError
ãã¹ããŒãããŸãã ããããã¹ãŠã®æäœãã¯ãªãã¯ãããåŸã«ã®ã¿ãå¿
èŠãªãã®ããã¹ãŠæã£ãŠããããšãæããã«ãªãããã§ãã ããã¯éåžžã«äžæ°å³ã«èŠããããšã«èª°ããåæããŸããïŒ


ããã¯ãç·è²ã§åŒ·èª¿è¡šç€ºãããŠããŸã-ããã¯äœã§ããïŒ ãã®æ§é å
šäœã®åé¡ã¯ããã®è匱æ§ã§ãã ãããŠããã ãã§ã¯ãããŸããã ããšãã°ãé床ã«é·ãXPathã䜿çšããŠãã人ã¯ããŸããïŒ Longã¯ã1è¡ããé·ãããšãæå³ããŸãã å£ãããããã±ãŒã¿ãŒã¯ããã¹ããäžæ°å³ã«ãªãäž»ãªçç±ã®1ã€ã§ãã Selenideã¬ããŒãã§ãã®åé¡ã®è§£æ±ºã«ã€ããŠå€ããåŠã¶ããšãã§ããŸãã
ç¶æ³ãæ¹åããã«ã¯ããã€ãã®æ¹æ³ããããŸãã ãŸãããœãŒã¹ã³ãŒãã«ã¢ã¯ã»ã¹ãããããç·šéããæš©éãããå Žåããã¹ãæžã¿ã®ã¢ããªã±ãŒã·ã§ã³èªäœãæ£ããæžãæããããšãã§ããŸãã 圌ã¯ãã€ãããã«ããããã§ã¯ãããŸããã è±åœã®éçºããŒã ãååæã®ãã±ãããä»ããŠã«ãŒããã¢ã®ãã¹ãããŒã ãšéä¿¡ããããšããããŸãããŸããã¢ããªã±ãŒã·ã§ã³ããæ£åžžã«ãåäœããäžæ¹ã§ããã¹ãã«åæ Œããªããšèšã人ãããŸãã ã³ãŒãã«ã¢ã¯ã»ã¹ã§ããå Žåãæå³ã®ããèå¥åãèŠçŽ ã«è¿œå ã§ããŸãïŒã¯ã©ã¹ãç¹å®ã®å±æ§ã

ãããããåäžã®By
å
¥åãåãå
¥ããWebDriver.findElement
ãããªãã®ããããŸãã æåã§ç¶æ¿ã§ããŸãã ã»ã¬ã¯ã¿*
ã§ãã¹ãŠã®èŠçŽ ãæ¢ããããªãŒå
ã®ãã¹ãŠã®åèŠçŽ ãæ¢ãã屿§ã®å€ã§ãã£ã«ã¿ãªã³ã°ããŸãã ãã ããããã¯éåžžã«éå¹ççã§ãã WebDriverãŸãã¯Selenium APIãžã®ååŒã³åºãã¯ããªã¢ãŒãããã·ãŒãžã£ãžã®åŒã³åºãã§ãããäœããã®æ¹æ³ã§ãããã¯ãŒã¯ãä»ããŠè¡ãããŸãã

代ããã«ããããã¯ãã¹ãŠJavaScriptã§èšè¿°ã§ãããŸã£ããåãããšãè¡ããŸãã ã¹ã©ã€ããèŠããšãã¯ããã«è€éã§æãããã«èŠããŸãããæ¬è³ªçã«ã¯ãã³ã³ããã¹ããåããå°ããŸã-ããªãã¯æ¬åœã«WebDriverã§ããïŒ æ¬¡ã«ãã©ãããããWebDriver
ããããæœåºã§ããŸãã ãŸããJavaScriptãå®è¡ãããããããã«JavaScriptãJavascriptExecutor
ãã£ã¹ãããŸãã ããããªããšãªã©ã 誰ããç¥ããªããããããŸãããã executeScript()
ã¯èŠçŽ ããã®ä»ã®ããŸããŸãªãã®ãè¿ãããšãã§ããŸãã ãã©ãŠã¶ã«ç§»åããããã§äœããã®äœæ¥ãè¡ããçµæãè¿ããŸããçµæã¯Javaåã«æ£ãããã£ã¹ããããŸãã ç»é¢ã«è¡šç€ºããããã®ã¯å®éã«æ©èœããŸãã
äžéšã®éçºè
ã¯ãæ¢ã«å®è£
ãããŠããããšãç¥ããã«ããã®ãããªæ©èœã倢èŠãŠããŸãã æ¢ã«èŠçŽ æ€çŽ¢ãšã³ãžã³ãçµã¿èŸŒãŸããŠããJSãã¬ãŒã ã¯ãŒã¯ããããšããŸãã ã©ã³ãã IDã®çæãªã©ãåçŽãªãã®ã§ãã£ãŠã:-)ãã®ã¡ã«ããºã ãåå®è£
ããããšã¯ã§ããŸããã å¿
èŠãªèŠçŽ ãèŠã€ããããã«ãã¬ãŒã ã¯ãŒã¯èªäœã«æ°è»œã«å°ããŠãã ããïŒ ããã«ãããçæŽ»ã倧å¹
ã«ç°¡çŽ åãããŸãã
ãŸããSeleniumãJavaScriptã䜿çšããçç±ã远å ããŸãã ã©ã®èªè
ãã¢ããªã±ãŒã·ã§ã³ã§JavaScriptãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠããŸããïŒ JQueryãReactãAngularããŸãã¯èªå®¶è£œã®æªå€¢ïŒ ããã§ããããšã®å¯Ÿè©±ã«ã¯ãJavaScriptã䜿çšããå¿
èŠããããŸãã ç§ãåŒçšããäŸã§ã¯ãjQueryã¯ã¯ãšãªã®æ°ã远跡ããŸããã ã·ã¹ãã ã§äœãèµ·ãã£ãŠããã®ãã«ã€ããŠãã·ã¹ãã ããæç¢ºãªæ
å ±ãååŸããä»ã®æ¹æ³ã¯ãããŸããã æã«ã¯ãããå¿
èŠã§ãã ããã«ãWebDriverã¯ãŠãŒã¶ãŒã®åäœãã·ãã¥ã¬ãŒãããããšããŸãã ãŠãŒã¶ãŒã¯äœãããŸããïŒ åœŒã¯ãã©ãŠã¶ãã¯ãªãã¯ããå°å·ããèŠçŽ ãã¯ãªãã¯ããŸãã WebDriverãšSeleniumã«ã¯ã§ããªãããšããããŸãã HTTPã¹ããŒã¿ã¹ã³ãŒããŸãã¯ãããã¯ãŒã¯ãã©ãã£ãã¯ãç£èŠããå Žåã¯ããããã·ãå¿
èŠã«ãªãå ŽåããããŸãã ããŒãžã§äœããçºçããå Žåãæè¯ã®ãªãã·ã§ã³ã¯ããŒãžèªäœã«å°ããããšã§ãã ããšãã°ãããªãé »ç¹ã«èå¥åãã©ã³ãã ã«äœæãããŸããããããã¯æŽç¶ãšäœ¿çšãããŸãã ãã®ãããåžžã«ãã®å¯çšæ§ãåœãŠã«ããããšã¯ã§ããŸããã ããŒãžã«ç§»åããŠãèŠçŽ ãã©ã®èå¥åã§ãããã確èªããéåžžã®ã€ã³ããã¯ã¹ã§äœ¿çšã§ããŸãã ãã®ã¡ã«ããºã å
šäœã«ãããã°ã¬ãŒããã¯ã¹ãã¹ããå®è¡ã§ããŸãã ããã¯ã€ãããã¯ã¹ããšã¯ããã¹ãäžã«å
éšã®ã·ã¹ãã ã«å®å
šã«ã¢ã¯ã»ã¹ã§ããå Žåã§ããããã©ãã¯ããã¯ã¹ãã®ç¶æ³ã§ã¯ãã·ã¹ãã ã¯ãŸãã§å®å®ãããã£ãŠæ¥ããã®ããã«å¯éãããŸãã ãŸãããã°ã¬ãŒããã¯ã¹ãããã¹ããããšãã¯ãæåã¯å
éšã®ãã¹ãŠãè€éã§ããããšã«é ãã€ããã§ãããããã§äœãã倿Žãå§ããããã«ãã³ãã©ãŒãæ¿å
¥ããŸãã 誰ãããããããã¯ãšèŠãªããŸãã ã©ãªãŒãŠã©ãŒã«ã¯ããã¡ãŒã¹ãã¯ã©ã¹ã®éçºè
ã«ã¯ãã€ã©ã€ã©ã,æ
¢ãæ lazãšãã3ã€ã®å質ãå¿
èŠã ãšèããŠããŸãã çŠãã¯ãã¹ãŠãä»èµ·ããããšãå¿
èŠãšããŸãã ããã«ãããããã°ã©ã ã¯é«éã«ãªããŸãã ããªããäœåºŠãäœåºŠãäœããããããã«æ±ããããå Žåãããªãã¯ãããããªãã§ããããããã®ããã®è»ããããŸãã æ ãè
ã¯ãäžåºŠã¯äœåºŠãåãæºåãã§ããŠããã®ã§ãäºåºŠãšä»äºãããããšã¯ãããŸããã ãã®ããã説æããã¢ãããŒãã§ã¯ãããã¯ã§ã¯ãªãæ ãèŠããŸãã ç§ã¯ãããã©ã®ããã«æ©èœããããçè§£ããããšããããšãã§ããŸã-ãŸãã¯ãããã«ã€ããŠèª°ãã«å°ããããšãã§ããŸãã ç§ã®äººçã¯æ¥œã«ãªããŸãã ãŸããaræ
¢ã¯æ£è²¡ãããã ãã§ãã
å¥ã®ãããã¯ã¯ãã€ãã³ãã®äºæ³ã§ãã Selenium- Wait<?>
ã¯ãã®ãããªããšãããWait<?>
ã

誰ãã圌女ã«ç²ŸéããŠããããšãé¡ã£ãŠããŸãã Seleniumã«ã¯äœããåŸ
ã€æ¹æ³ã2ã€ãããŸããæç€ºçãšæé»çã§ãã æé»ã®ãã¡ã«ãç§ãã¡ã¯äœããã®äžæè°ãªæéããæç€ºçã«åŸ
ã£ãŠããŸã-ããªããä»èŠãŠãããã®ã䜿çšããŸãã SeleniumããŒã ããã®ã¢ããã€ã¹ïŒæé»ã®æåŸ
ã䜿çšããã Wait.until
䜿çšããŠWait.until
ïŒ..ãªãã§ããïŒ åé¡ã¯ãååãšããŠã人ã
ã¯åŸ
æ©ããæéãç¥ããªããããæé»ã®åŸ
æ©æéãæå€§1åã«èšå®ããããšã§ãã ãã¹ãŠãæ£åžžã§ããå Žå-ããã¯åé¡ã§ã¯ãªãããã¹ãŠãæ£åžžã§ãã ãã ãããã¹ãã倱æããå Žåã忢ãããŸã§ã«1åããããŸãã ããã«ãããéåžž5ã15åããããã¹ãã®èµ·åã«æ°æéãããããšããããŸãã
æç€ºçãªåŸ
æ©æéãæé»çãªåŸ
æ©ãããçãå Žåãæ¬è³ªçã«ã¯æé»çãªåŸ
æ©ã®çµæã®ã¿ãåŠçããŸãã ããã¯éåžžã«çŽããããããã®ãããªãã¹ãããµããŒãããããšã¯äžå¯èœã§ãã ããããããã§ãã§ããŸãã
ã¯ããæç€ºçãªæåŸ
ã¯æé»çãªæåŸ
ãšéåžžã«å¥åŠã«çžäºäœçšããŸãã å¥åŠãª-ãäºæž¬äžå¯èœããæå³ããŸããã å®éããã¹ãŠãå®å
šã«äºæž¬å¯èœã§ãã æé»ã®åŸ
æ©æéãèšå®ããã³ãã³ããå®è¡ãããå Žåãã¿ã€ã ã¢ãŠãã«ãªããŸã§å®è¡ã¯çµäºããŸããã æé»ã®åŸ
æ©æéã10ç§ã§ãããæç€ºçãªåŸ
æ©æéã15ã§ãããšããŸãã10ç§åŸã«å€±æããããšãå ±åããèŠæ±ãå®è¡ããŸãã æ¬¡ã«ãæç€ºçãªåŸ
æ©ã¯10ãš15ãæ¯èŒããŠã15ã®æ¹ã倧ãããšå€æããåã³10ç§éæ°ããåŸ
æ©ãå®è¡ããŸãã é ãæ©ãŸããŠããã®ã«ã15ãšå°ããã20ç§åŸ
ã€ã®ã¯ãªãã§ããïŒ æé»ã®æåŸ
ããã€éå§ããããã¯å¿
ãããæç¢ºã§ã¯ãããŸããã ãããã£ãŠããã¹ãŠãäºæ³ã©ããã«è¡ãããŸããããã®å
éšã¡ã«ããºã ãç¥ããªãå Žåãå€éšãããã®åäœã¯éåžžã«å¥åŠã«èŠããããªãã®äººçã¯éåžžã«å°é£ã«ãªããŸãã ç§ã®ã¢ããã€ã¹ã¯ãæé»ã®æåŸ
ããŸã£ãã䜿çšããªãããšã§ãã æç€ºçãªæåŸ
ã«ã¯ç¹å®ã®æ
å ±ãå«ãŸããŸãã ãã¹ãã¹ã€ãŒãã¯ã³ãŒãããã§ãã¯ããã ãã§ãªããã³ãŒãã«äžæ
£ããªäººã®ããã«ã·ã¹ãã ãã©ã®ããã«æ©èœããããèšè¿°ããŸãã ããšãã°ãæç€ºçãªæåŸ
ã¯ãçŸæç¹ã§ã¯ãã€ã³ã¿ãŒãããæ¥ç¶ãçºçããå¿
èŠããããAJAXåŒã³åºããè¡ãå¿
èŠããããäœããæŽæ°ããå¿
èŠãããããªã©ã§ãããã¹ããèªãã§ãã人ãå°ãããããããŸããã 圌女ã¯ããããã¹ãã§ããïŒ ãªã圌女ã¯ãããããŠããã®ã§ããïŒ ããã«ãããç°ãªãã¢ãããŒãã§ã¯äžå¯èœãªå¯Ÿè©±ãè¡ãããšãã§ããŸãã äžè¬ã«ãæç€ºçãªæåŸ
ãšæé»çãªæåŸ
ã¯çžäºã«äœçšããå¿
ãããæçœãªæ¹æ³ã§ã¯ãããŸããããæé»çãªæåŸ
ã¯åžžã«åªå
äºé
ã®ããã«èŠããŸãã
å
ã®ãã¹ãã«æ»ããŸãã

圌ã¯ã©ãã§ãå¯ãŠããŸããã çŽ æŽãªã¢ãããŒãã¯ãããæç¹ã§åŸ
æ©ããå¿
èŠãããå ŽåThread.sleep()
å®è¡ããã ãã§ãã ãã®ã¢ãããŒãã®åé¡ã¯ããã¹ãã®åŸ
æ©æéãé·ãããããšã§ãã ããã¯å¿
èŠãããŸããã
代ããã«ã Wait
ã¯ã©ã¹ã䜿çšããŠWait
ã ãã®å©ç¹ã¯ããžã§ããªãã¯ã䜿çšãããããå
¥åã§ã¹ããŒããåãuntil()
ã¹ããŒãuntil()
ããšã§ãã ããšãã°ã Wait.until(d -> driver.findElement(...))
ãšæžãããšãã§ããŸããããã«èŠçŽ ãã¹ããŒããuntil
èŠçŽ ãèŠã€ããŸãããããã.isDisplayed()
ãåŒã³åºããšéåžžã«äŸ¿å©ã§ãã
ããã«ãWebElementãžã®ãªã³ã¯ãä¿åãããšäŸ¿å©ãªå ŽåããããŸãããããã¯äœããã®çç±ã§åé¿ãããŸãã ç§ã¯ããªãå€ãã®ã¯ã©ã€ã¢ã³ããšã³ãã¥ãã±ãŒã·ã§ã³ãåãã圌ãã®ãµã€ãã«ã¢ã¯ã»ã¹ããèŠçŽ ãšã®ããåãããšã«åã³æ¢ããŠããããšã«æ°ä»ããŸãã ãããã£ãŠãåã¢ã¯ã·ã§ã³åŒã³åºãã«å¯ŸããŠã2ã€ã®ãªã¢ãŒãåŒã³åºããè¡ãããŸãã å€ãååŸããŠããŒãéä¿¡ããå¿
èŠããããšããŸãã ãã®å Žåãå€ãã®å Žåãæåã«driver.switchTo().activeElement().clear()
driver.switchTo().activeElement().sendKeys()
ãæ¬¡ã«driver.switchTo().activeElement().sendKeys()
ãŸãã
ããããèŠçŽ ã¯åãã§ãã 倿Žã§ããå¯äžã®ç¶æ³ã¯ãDOMããå®å
šã«åé€ãŸãã¯åæãããå Žåã§ãããã®å Žåã StaleElementReferenceException
ãŸãã çããã¯ãã®äŸå€ã«å€¢äžã§ã¯ãªãã§ããïŒ äœããDOMãæŽæ°ããã¢ã€ãã ããªããªã£ãããšãå ±åããŸãã ããã¯ãåŸ
æ©ãèšå®ããæ©äŒã倱ãããŠããããšãæå³ããŸããç®çã®ã¢ã€ãã ã衚瀺ããããŸã§åŸ
æ©ããããšã¯ã§ããŸããã

ç»é¢ã«è¡šç€ºãããã³ãŒãã¯ãåŸ
æ©æéãæå°åããããããæé©ãªæéãå®è¡ããŸãã ãã®ã³ãŒãã§ãã¹ããåéãããšãçµæã¯ãŸã£ããå€ãããŸããã
ãŸã èªãã§ããŸããïŒ ãããŸã§ã®ãšãããæ°ããããšã¯äœãèšã£ãŠããªãããšãé¡ã£ãŠããŸã:-)
ã ãããã°ã¬ãŒããã¯ã¹ãã¹ãã

æåŸ
ããã广çã«ããæ¹æ³ããããŸãã äžèšã®ã¹ã©ã€ãã®isJqueryDone()
ã¡ãœãããèŠãŠãã ããã 圌ã¯ã¢ã¯ãã£ããªæäœã®èšé²ãä¿æããŸãã jQuery.active
ã0ã«ãªããšãä»ã«äœãèµ·ããŠããªãããšãæããã«ãªããŸãã
äžæ¹ã§ããªããããã®çµ±èšãèŠã€ããããã«åžžã«ããŒãžããã«ããã®ã§ããïŒ çµå±ãJSãã¬ãŒã ã¯ãŒã¯ã«ã¯åæ§ã®ã¡ã«ããºã ããããŸãã ããšãã°ãAngularJSã®å Žåã ãªãããã ãã«å¶éã§ããªãã®ã§ããïŒ ãããããã©ã€ãã©ãªã¯åã«é©åãªã¬ãã«ã§ã¯ãããŸããã
ããã§ããåé¡ã¯ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠè§£æ±ºã§ããŸãã AJAXåŒã³åºããè¡ã£ãŠããããããå®äºãããã©ãããç¥ããããšããŸãã æã
ãDOMã¯æŽæ°ããããæ°ããã³ã³ãã³ããåçŽã«ããã«ã¹ããŒãããŸãã ãã¹ããç¶è¡ã§ãããã©ãããäžæç¢ºã«ãªããŸãã ãã¶ããã¹ãŠãåããŸãŸã§ããã¹ããç¶è¡ã§ããŸããïŒ ãã®ãããªç¶æ³ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã§ç£èŠãã䟡å€ããããŸããæå³ã®ããæäœãè¡ããšãã¯ã倿°ãäœæããå¿
èŠããããæäœãå®äºããåŸããã®å€ããªã»ããã§ããŸãã ãã®åŸããã®å€æ°ããã§ãã¯ããããšãå¯èœã«ãªããŸããæ£ããå€ããšããšãããã«ãã¹ããå®å
šã«ç¶è¡ã§ããããšãæå³ããŸãã
æåŸã«ã Seleniumã«æ¯æŽãæ±ããããšãã§ããŸãã 廿¢ãããã¢ã€ãã ãžã®åç
§ã¯ã圹ã«ç«ã€æ
å ±ã«ãªãå ŽåããããŸãã ã¢ã¯ã·ã§ã³ã®çµæãšããŠãDOMèŠçŽ ãæŽæ°ãããDOMããåé€ãããããšãäºæ³ãããå Žåããã®ã¢ã¯ã·ã§ã³ãå®è¡ãããåã«èŠçŽ ãžã®ãªã³ã¯ãååŸã§ããŸãã ãã®åŸã StaleElementReference
äŸå€ãåŸ
æ©ããæ°ããèŠçŽ ãèŠã€ããŠè¿ãããšãã§ããŸãã Wait
ã§ããã€ãã®çš®é¡ã®äŸå€ãç¡èŠã§ããããããã®ã³ãŒãã¯ç°¡æœã§æŽç¶ãšããŠããã䜿ããããã§ãã ã»ã¬ã³ã¯ããã€ãã®ä»äºãåŒãåããŸãã DOMã®å€æŽãã€ãŸãäœããå
éšã§åããããšã瀺ãã·ã°ãã«ã¯ããã¹ããããå®å®ãããçŽ æŽãããæ©äŒã§ãã
ããŒãžãªããžã§ã¯ãã«ç§»ããŸãããã å€ä»£ããŒãç¥è©±ããã€ãã¹ç¥ã«ã€ããŠèããããšããããŸããïŒ

ã€ãã¹ã¯éå»ãšæªæ¥ãèŠãåé ã®ç¥ã§ãã 1æã圌ã«ã¡ãªãã§åä»ããããçç±ã§ãã
ããŒãžãªããžã§ã¯ãã¯å€ãã®å Žåã誀解ã®ç ç²ã«ãªããŸãã SeleniumConfã®ã¹ããŒãã§ã¯ãPageObjectsã®èªåçæãèŠçŽ ã®èªåé
眮ã«é¢ãããã¬ãŒã³ããŒã·ã§ã³ããããããããŸããã ããã¯ã§ããŸãã ããã¬ãŒã ã¯ãŒã¯ãæžããããã«èŠããŠãããªãã¯çŽ æŽããããå®éã«ã¯ãã¹ãŠããã£ãšæªããªãã®ã§ãããã¯çŸããèŠããã ãã§ãã
å
ã®å®çŸ©ã§ã¯ãPage Objectã¯Janusã®é¡ã®1ã€ã§ãã ãããã¯ãŠãŒã¶ãŒåãã®ãµãŒãã¹ã§ãã ãã¹ã察象ã®ã¢ããªã±ãŒã·ã§ã³ã«ãã°ã€ã³ããŒãžãããå Žåã¯ããã°ã€ã³ããŒãžã«ãã°ã€ã³ããŠããµããžã§ã¯ããšãªã¢ã®èšèªã§ããããã¹ãŠã説æããŸãã ãã®ãããªãã¹ããããžãã¹åæããããžã§ã¯ããªãŒããŒãäž¡èŠªã«æç€ºãããšãã¢ããªã±ãŒã·ã§ã³ãæ£åžžã«åäœããŠãããã©ãããããã«æããã«ãªããŸãã ããããPage Objectã«ã¯ãã³ãŒããšããŒãžæ§é ã®æ·±ãç¥èãå¿
èŠãšããJanusã®å¥ã®é¡ããããŸãã ããã¯ãDRYïŒãç¹°ãè¿ããªãã§ãã ãããïŒãæœè±¡åã«å¿
èŠã§ãã LoadableComponent
ç°¡åã«ããããã«ãSeleniumã¯LoadableComponent
ã¯ã©ã¹ãæäŸããŸãã Page Objectãšããååã¯æ¬è³ªãããŸãåæ ããŠããªãããã§ãããªããªããããã§ã¯å°ããªããŒã¹ã§ã·ãã¥ã¬ãŒãã§ããæå³çã«ãµã€ãºãå°ããã§ããããã§ãã

ããã§ã¯ããŒãžãªããžã§ã¯ãã䜿çšãããã¹ãããããŸãã åã®ãã¹ããšãŸã£ããåãã§ãã User
ãªããžã§ã¯ããäœæãããã°ã€ã³ããŒãžã«ç§»åããŠdriver
ãšæå€§ã¿ã€ã ã¢ãŠããæž¡ãã get()
ãå®è¡ãget()
ã ããã¯ã LoadableComponent
ã¢ãã«ã«åŸã£ãŠçºçããŸãã ãã°ã€ã³ãããšãã¡ã€ã³ããŒãžã«æ»ããŸãã ãã®ãã¹ãã§ããŒãžãªããžã§ã¯ããã³ãã¬ãŒããå®è£
ããæ¹æ³ã®å©ç¹ã¯ãããã²ãŒãã§ããããšã§ãã ãã°ã€ã³ããŒãžãMainPageãã¹ããŒããªããªã£ãå Žåã颿°ã®çœ²åã倿ŽããsignUpã¡ãœããããäœãä»ã®ãã®ãè¿ããŸãã ãã®ãããªãã¹ãã¯å®è¡ããå¿
èŠãããªããåã«ã³ã³ãã€ã«ããŸããã
ãã¢ãèŠãŠã¿ãŸãããïŒ

ããã¯ç°¡åãªToDoãªã¹ãã§ãã ããã¯é©ãã¹ãããšã§ã¯ãããŸããããã¢ã€ãã¢ããã瀺ããŠããŸãã

SignupPage.signUp()
颿°ã®ã³ãŒãã§ã¯ãèŠçŽ ã®æ€çŽ¢ã®ã¿ãçºçããŸãã

ãã¹ãŠãæœè±¡åããããã®1ã€ã®é¢æ°ã«é
眮ãããŸãã ãã°ã€ã³ããŒãžã®ã³ãŒãã倿Žãããå Žåããã®é¢æ°ã¯ä¿®æ£ãå¿
èŠãªå¯äžã®å Žæã§ãã éçºè
ãUIã¯ãŒã¯ãããŒã倿Žããããäžéšã®èŠçŽ ã®ååã倿Žããå Žåããã¹ãŠã®å€æŽã¯ããã«ãããŸãã å¥ã®æ¹æ³ã¯ãäœçŸäžãã®ãã¹ããå®è¡ããŠä¿®æ£ããããšã§ãã
ããã§åºæ¬ã¯çµããã§ãã ãµããŒãã®å®è£
ãç°¡åãªãã¹ãããããŸãã Seleniumãæ¡åŒµãã1ã€ã®æ¹æ³ã¯ãé©åã«å®è¡ãããç°¡åã«ä¿å®ã§ãããã¹ããèšè¿°ããããšã§ãã ãã€ãŠç§ã¯ã圌ãã®ä»äºã¯ãã¹ãã¹ã€ãŒããã°ãªãŒã³ã«ããããšã ãšèšãããã¯ã©ã€ã¢ã³ããšäŒããŸããã ãã¹ãŠã®ãã§ãã¯ãåé€ããããšã§ãã®åé¡ã解決ããäŸå€ãçºçããå Žåã¯ãã¹ããæ£åžžã«å®äºããŸããã äžè¬ã«ãã¹ãã¯æåããŸããããäœã®æå³ããããŸããã§ããã
ãŸãã䜿çšãããããŒã¿ã¯éåžžã«éèŠã§ãã ã¢ããªã±ãŒã·ã§ã³ãå®å
šã«ã¹ããŒãã¬ã¹ã§ããå¯èœæ§ã¯ã»ãšãã©ãããŸããã ã»ãšãã©ã®å ŽåããŠãŒã¶ãŒãæ°žç¶ããŒã¿ãªã©ããããŸãã ããŒã¿ã¯ããã¹ããã¹ã±ãŒãªã³ã°ãããšãã«çºçããåé¡ã®1ã€ã§ãã ãã¹ãã䞊ååããæ¹æ³ã«é¢ããããã€ãã®æšå¥šäºé
ããããŸãã

ãŸããJavaã®static
ããã³ã·ã³ã°ã«ãã³ã®ãã¶ã€ã³ãã¿ãŒã³ã¯æªã§ãããé¿ããã¹ãã§ãã ãã®çç±ã¯ãéçãã£ãŒã«ãã¯ãã¹ãŠã®ã¹ã¬ããã«å
±éããŠããããã§ãã ãã®ãã£ãŒã«ãã2ã€ã®ãã¹ãããåæã«å€æŽãããšãçµæã¯äºæž¬ã§ããªããªããŸãã ã¯ã©ã€ã¢ã³ããšéä¿¡ãããšãã«ãéç倿°ã䜿çšããŠWebDriverãžã®ãªã³ã¯ãä¿åããããšããããããŸãã ãã¹ãã䞊è¡ããŠå®è¡ãããå Žåã®ãã¹ãã®ã¯ã¬ã€ãžãŒãªåäœã«ã€ããŠäžæºããããŸããæã«ã¯åäœããå Žåãšåäœããªãå ŽåããããŸãã ããã¯ãç«¶åç¶æ
ããšåŒã°ããŸãã
static
ãé¿ããããšããŠã ThreadLocal
䜿çšã«åãæ¿ããŸãã ããããåœŒãæªã§ãã ã¹ã¬ããã¢ãã£ããã£ã«äŸåããããã«ãªããŸãã ãã¹ããåãã¹ã¬ããã§å®è¡ãããããšãåžžã«ç¢ºä¿¡ããŠããå Žåãã¬ãã«éã§ããŒã¿ãå®å
šã«ãã¬ããŒãã§ããŸãã ããŒã¿ïŒWebDriverã€ã³ã¹ã¿ã³ã¹ããŠãŒã¶ãŒåïŒããã¬ããŒãããå¿
èŠããããšããäºå®ã¯ããã§ã«æªãå
åã§ãããã³ãŒãã®ã«ããã§ãã ãããã£ãŠããããã¯äžååãªæ§é ã§ãã ãããã¯çè§£ããã®ãé£ãããç¶æããã®ãé£ããã§ãã çè§£ããã®ãé£ãããã¹ãã¯ã倧ããªãã©ãã«ã®åå ã§ãã ããååã¯ããã¹ãããããã°ããã«ã¯ãæžãããã2åã®ç¥æ§ãå¿
èŠã ãšèšããŸããã ãã¹ããæžãããã«ãã¹ãŠã®èœåã䜿çšããªããã°ãªããªãã£ãå Žåããããã°äžã«è¡ãæ¢ãŸãã«é¥ããããããæãåºãããšã¯éåžžã«èŠçã«ãªããŸãã Javaãå«ãã颿°åããã°ã©ãã³ã°ãæããŠãããããšã®1ã€ïŒçæ³çãªã³ãŒãã¯äžå€ã§ãªããã°ãªãããã¹ããŒãã¬ã¹ã§ãã£ãŠã¯ãªããŸããã äœãã倿Žããããã«ïŒåã®å³ã®ããã«ïŒ Todo
ãªããžã§ã¯ããäœæããå Žåãæ°ãããªããžã§ã¯ããäœæããå¿
èŠããããŸãã å¯å€ç¶æ
ã§åæã«åäœãã2ã€ã®ã¹ã¬ãããããå Žåãããã¯ã²ã©ãçµæã«ã€ãªãããŸãã
ãã®ãã¹ããæ³åããŠãã ããããŠãŒã¶ãŒFredãexample.comã«ã¢ã¯ã»ã¹ããŠãã°ã€ã³ãããšãç»é²ãæåããå¿
èŠããããŸãã ãã¹ããåããŠæåãããšãã ãã ãããã¹ããå床å®è¡ãããšãFredãšããååã®ãŠãŒã¶ãŒãæ¢ã«ç»é²ãããŠããããããã¹ããã¯ã©ãã·ã¥ããŸãã äžå¿«ã§ããã ç§ã¯ããªãããã®ãããªãã®ã«åžžã«äŒããšç¢ºä¿¡ããŠããŸãã é©åãªã¢ãããŒãã¯ãåãã¹ãã§ããŒã¿ãç¹å¥ã«æºåããããšã§ãã

ãã¹ãå®è¡ã®éã«ç°å¢ãåäœæããããããã®åé¡ã¯äžè¬çã§ã¯ãããŸããã , CI/CD ( ). ( , ), , .
, . â «» .

- , , . . dev , , . . , ! , happy path.
dev . : - ( - - , todo), , . , , , , . , , . â . , «».
-.

, . , LDAP. . , â , LDAP, . , . , , , . , . , , . , â , . , , - . . , . , JUnit Assume
. .
, . , , . , , , . , . , . , , , â « ?», â « , ». . , , . , .
, , , , . Page Objects , , Screenplay, . , .
Selenium?

WebDriver Wire. , JSON- URL. : Json Wire Protocol W3C Dialect. OSS Dialect. , ChromeDriver, FirefoxDriver, Selenium Server, PhantomJS. W3C â Wire, . . â , , â Actions. Selenium Grid FirefoxDriver, drag-n-drop. . .
Selenium: .

. Selenium Grid. :

Selenium . :

, . . , , , . : Firefox, Chrome , , macOS â Safari:

, ChromeDriver, GeckoDriver, , . : ? Docker . â -!
, ? , , . . Docker , , â .
, Selenium , . â Selenium Docker . , . , GeckoDriver ChromeDriver, Firefox GeckoDriver . . Selenium- , Docker-.

( Chrome, â Firefox).

.

, Docker , . , . , . , 8 , . , , â .

, , . , Docker . Zalenium . .

Docker, :

. , . ãããããã¥ã¢ã³ã¹ããããŸãã Windows, , , Edge.

. . , Zalenium .

Zalenium --sauceLabsEnabled true
, Sauce Labs . , , Sauce Labs , .

*Zalenium*** .

Zalenium , /dashboard
. , . , . , , Windows macOS, Sauce Labs , BrowserStack - .
. , . , Selenium , , HTTP, . , , .
. â DDoS, , . , . , - . Selenium , . , , .

, â « ». , â ( «»), - ( «»). , , . , . , â - , â .
, : - .

, . , -. : Selenium-. Selenium â .
. . , . Buck Bazel , , . .
, . , , , â . , , . , , . JavaScript, . , ? , , , . . , .
åºåã®åã ãããããåç¥ã®ããã«ãäŒè°ãè¡ã£ãŠããŸãã â Heisenbug 2018 Piter , 17-18 2018 -. , ( â ), . , , !