èªè
ã®çãããããã«ã¡ã¯ïŒ ããã€ãã®å
¥åãã£ãŒã«ããš1ã€ã®ãã¿ã³ãããå°ãè€éãªSelenuimãã¹ããæžãããšãã§ãããªãããã®èšäºã圹ã«ç«ã€ãããããŸããã
æ°åãã¹ãã±ãŒã¹ãå®è¡ããããšãçªç¶æåŠããè€éãªã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ã§å£ããcssãŸãã¯xpathã»ã¬ã¯ã¿ãŒãèŠã€ããŠããã°åºåãåŸ
ã€ããã«äœåºŠãäœåºŠããã®ã¹ã¯ãªãããç¹°ãè¿ãå®è¡ããããšã匷ããããã³ã³ãœãŒã«ã«ã Seleniumãã¹ããå¿«é©ã«äœæã§ããããšãããããŸããïŒ
èšäºã¯äœã§ãã-èšãæããã°ãåå¿è
åãã»ã¬ã³ã«ã€ããŠã ãã€ãŠã¯FireFoxã®åãªããã©ã°ã€ã³ã§ããã ãèšé²ããã¿ã³ãæŒããšããã¹ãããããµã€ãã®ã€ã³ã¿ãŒãã§ãŒã¹ïŒãã©ãŒã ããªã³ã¯ïŒã®ãã«ãéå§ããŸãã ããã°ã©ãã³ã°ã®ç¥èãã»ãšãã©ãŸãã¯ãŸã£ãããªããŠããå¿
èŠãªæ€èšŒå€ã代å
¥ããããšã§ãçµæã®ã¹ã¯ãªãããç·šéã§ããŸãã ããã ãã§ã-ãã¹ãã®æºåãã§ããŸããïŒ å±éåŸã«æ¯åå®è¡ããèã§ç§»åãããã®ã確èªããŸãã 次ã«ãSeleniumã¯ããŸããŸãªèšèªã®APIãè¿œå ããŸããã ç¹ã«ãJAVAçšããããŸãã APIã䜿çšããŠãåãããšãå®è¡ã§ããŸããç®çã®ãµã€ãã§ãã©ãŠã¶ãŒãèµ·åãããã©ãŒã ã§éä¿¡ãããå€ã確èªãããªã³ã¯ããã©ããªã©ã åé¡ã¯ãã¹ã¯ãªããã®å®è¡ãé
ãããšã§ãã ãã¹ãããã¹ãããã«ã¯ãã¹ã¯ãªãããåèµ·åããå¿
èŠããããããã¯åäžãªæ·åã§ãã ClojureïŒJAVAã®äžéšïŒã䜿çšãããšããšãã£ã¿ãŒã§REPLãä»ããŠå®è¡äžã®ããã°ã©ã ã®ã³ãŒããå®è¡ã§ããŸãã
Seleniumãã¹ãã䜿çšãããããžã§ã¯ãã®åæ
ãã®ãããžã§ã¯ãã¯GitHubã§å©çšã§ããŸã ãæ©èœïŒ
- ã¯ãã¹ãã©ãããã©ãŒã -Windowsã§ãããã¡ã€ã«+ãŠã£ã³ããŠã䜿çšããŠãã¹ããäœæãã* nixã§jarãã¡ã€ã«ãåéããŠããµãŒããŒã«ã¢ããããŒãã§ããŸãã
- ã»ã¬ã³ãšãã¡ã³ãã ã®2ã€ã®Webãã©ã€ããŒã§ããã«åäœããŸããSeleniumã§ãã¹ããèŠèŠçã«ãããã°ããPhantomã§åäœããjarãã³ã³ãã€ã«ããŠãCIã¹ã¯ãªããããã«ããLinuxãµãŒããŒã«ã¢ããããŒãããå¿
èŠãããå Žåã«äŸ¿å©ã§ãã
ãããžã§ã¯ãã®äŸåé¢ä¿ã§ã¯ãã©ã€ãã©ãª-clj-webdriverãèŠãããšãã§ããŸããããã¯ãWebãã©ã€ããŒãæäœããããã®ã¡ã€ã³ããŒã«ã§ããããã®ããã¥ã¡ã³ãã§ãã
ç°¡åãªãã¹ãäŸ-selenium-project.tests.gosuslugi-mainãåæããŸãããïŒ
(deftest gosuslugi-main-search-form (profile/open-browser "https://www.gosuslugi.ru/") (try (->> ($ ".index-slider-search input") (type-text "") (->>keys Keys/ARROW_DOWN) (->>keys Keys/ARROW_DOWN) (->>keys Keys/ENTER)) (when-not ($ ".title_search") (throw (Exception. "redirect to search result, error"))) (swap! profile/tests-success inc) (is true) (log/info "gosuslugi-main-search-form -> ok") (catch Exception e (log/info "gosuslugi-main-search-form -> fail" (.getMessage e)) (swap! profile/tests-fail inc) (is false))))
(deftest gosuslugi-main-search-form ...)
deftest
- clojure.test
ã©ã€ãã©ãªããã€ã³ããŒãããããã¯ãã ããã¯ããã¹ããèšè¿°ããããã®Clojureçµã¿èŸŒã¿ã©ã€ãã©ãªã§ãã ãã¹ãçšã®æšæºæ©èœããããŸãã deftest
ãã¯ãã¯åã«é¢æ°ãäœæããŸãã
ãã¹ãèªäœã¯ã Exception
ãåŒã³åºãããšã§ãã©ãŒã ã®å®è¡ãäžæããããïŒãŸãã¯èŠçŽ ãèŠã€ãããªãå Žåãªã©(try ... catch)
ã䟿å®äžããã¹ãã®å€±æãåŠçããcatch
ã§ãã©ãŒã ãå®è¡ããããã«(try ... catch)
ã©ãããããŠããŸãã
(->> ($ ".index-slider-search input") ...)
->>
-ããèªã¿ããããè£è¿ããã³ãŒããèšè¿°ããããã®æšæºçãªClojureãã¯ãã ããããªããšãã¹ã¯ãªããã¯æ¬¡ã®ããã«ãªããŸãã
(->>keys Keys/ENTER (->>keys Keys/ARROW_DOWN (->>keys Keys/ARROW_DOWN (type-text "" ($ ".index-slider-search input")))))
ãã¯ã->>
ã¯ãã©ãŒã ã®ãªã¹ããååŸããŠå±éããæåŸã®åŒæ°ãšããŠå®è¡çµæãé£ç¶ããŠæ¬¡ã®ãã©ãŒã ã«æž¡ããŸãã ãã¯ã->>
ã䜿çšããããã«ãåçŽãªèŠåã«åŸãããã€ãã®ã©ãããŒé¢æ°ãäœæããŸããããããã¯ãæåŸã®åŒæ°ãšããŠèŠçŽ ãªããžã§ã¯ããåãå
¥ãããããè¿ããŸãã
(swap! profile/tests-success inc)
ããã³(swap! profile/tests-fail inc)
ã¯ãæåãããã¹ããšå€±æãããã¹ãã®åçŽãªã«ãŠã³ã¿ãŒã§ãã
ãªãClojure
ç°¡åãªçãã¯ãè€éãã«å¯Ÿããæœè±¡åã®ã¬ãã«ã§ãã ãã§ã«Wikipediaã«è¡ã£ãŠ ããã®Lispæ¹èšã®æ§æãèŠãŠãå¿
ç¶ãåãå
¥ããæåã®æ®µéãçµãŠããã¯ãã§ãã ããªãããããæž¡ããã©ããã¯ããªã次第ã§ããç§ã¯çµéšã«åºã¥ããŠããã€ãã®ã¢ããã€ã¹ãäžããããšãã§ããã ãã§ãã
- Clojureã¯åŠç¿ã容æãªèšèªã§ãããå
¥åŠã®ãããå€ãé«ãã»ã©ãåŠæ ¡ããé ã«è¿œã蟌ãåœä»€åã¢ãããŒããšã®éãã«é¢é£ããŠããŸãã æèã®ç¡¬çŽæ§ãåæãããšãClojureãã¢ããªã±ãŒã·ã§ã³éçºãç°¡çŽ åãã䟿å©ãªããŒã«ã«å€ãã£ãŠããããšãããããŸãã
- ãã®ããã«è±å¯ãªæ¬åŒ§ã§æ··ä¹±ããªãããã«ããã«ã¯ã©ãããã°ããã§ããïŒ ãã©ã±ããã«ã¯ç¹å¥ãªåé¡ã¯ãããŸãã;ãã©ã±ããã®ç®çãç解ããæ¥ã«ã¯ããã©ã±ããã«æ
£ããŸãã ãŸããClojureéçºè
ã®ã€ã³ãã¥ããŒã·ã§ã³æéãä¿é²ããå€ãã®åªããããŒã«ããšãã£ã¿ãŒã«ç»å ŽããŸããã ãŸããã»ãšãã©ã®ç·šéè
ã¯çŸããParinferãå©çšã§ããŸãã ãããŠã第äºã«ããšãã£ã¿ãŒèšå®ã«ã¬ã€ã³ããŒãã©ã±ãããå¹³å¡ã«å«ããããšã§ãã
- ãã¹ããèšè¿°ããããã«Clojureã®å®å
šãªç¥èã¯å¿
èŠãããŸããã ãã©ã³ã¹ãã¥ãŒãµãŒãã¬ãã¥ãŒãµãŒãããã³ãã®ä»ã®æ¿åºŠ -ãã®ç 究ã¯åŸæ¥ãŸã§å»¶æã§ããŸãã éå§ããã«ã¯ãæ°æ©ã§ããŒã¹ãç¿åŸããã ãã§ååã§ãã
ã€ã³ãã³ãã«å¿ããŠParinferãæ¬åŒ§ãéããã®ã«ã©ã®ããã«åœ¹ç«ã€ã éçºããŒã«ã®ã¯ã€ãã¯ã¹ã¿ãŒã
60幎代ã®ã¢ã¡ãªã«ã§è¥è
ãããããŒãšããŠéããããªããèªç±ãæ°äž»äž»çŸ©ããœãããã©ãã°ã®ç²Ÿç¥ãå³ããããšãã§ããŸããã èµ·ãããªãã£ããšããŠã倧äžå€«ã§ããREPLClojureã䜿çšããŠãã®ç²Ÿç¥ãæããããšãã§ããŸãã
REPL Clojure-ã»ã¬ã³ãã¹ãã®èšè¿°ãå®å
šã«ç°ãªãã¬ãã«ã«ããŸãïŒ ãã®ä»ã®REPLã®äž»èŠãªæ©èœã¯ãæ¢ã«å®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ã§ããã®ç¶æ
ã倱ãããšãªãã³ãŒããèšè¿°ã§ããããšã§ãã ãã®ããŒã«ã䜿çšãããšãäœæ¥äžã®cssãŸãã¯xpathã»ã¬ã¯ã¿ãŒãã³ã³ãã€ã«ã§ããã ãã§ãªããä»»æã®é åºã§ãã¹ããå®è¡ããè€éãªã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ã倱ãããšãªãã倧èŠæš¡ãªãã¹ãã±ãŒã¹ã®ããŒãã®åäœããã§ãã¯ã§ããŸãã
Atomãšãã£ã¿ãŒã®REPLæ©èœã®ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ LightTableãšãã£ã¿ãŒã§REPLã䜿çšããŠè¡ããšã«ãããžã§ã¯ãã³ãŒããå®è¡ãã
Clojureã®ã³ãŒããšãã£ã¿ãŒ -ã»ãšãã©ãã¹ãŠã®äººæ°ã®ãããšãã£ã¿ãŒãšIDEã«ã¯ClojureããµããŒãããããã®ãã©ã°ã€ã³ãããã IntelliJ IDEA + Cursiveã®ãšã³ããªãããå€ãæãäœããšæ±ºããŸããã Cursiveã§ã®REPLã®ã»ããã¢ãããšäœ¿çšã«é¢ããå°ããªãã¥ãŒããªã¢ã« ã
ãŸã人æ°ïŒ
Leiningenã¯ãNode.jsã®äžçã®npmã®ãããªäŸåé¢ä¿ãããŒãžã£ãŒã§ãã äŸåé¢ä¿ãšããŠãLeiningenã¯Clojureã€ã³ã¿ãŒããªã¿ãŒèªäœãæ瀺ãããšããéãããããŸãã ãããã£ãŠã Leiningenãã€ã³ã¹ããŒã«ããã ãã§ååã§ãã圌ã¯Clojureãèªåã§ããŠã³ããŒãããŸãã
ãã®åŸãã³ã³ãœãŒã«ã«å
¥åããŠæ°ããClojureãããžã§ã¯ããäœæã§ããŸãã
lein new app example-selenium-project
Leiningenã¯ããããžã§ã¯ãããªãŒå
šäœãšæ§æãã¡ã€ã«-project.cljïŒnpmã§ã¯ãã®é¡äŒŒç©ã¯package.jsonïŒãäœæããŸãã
ãããã¡ã€ã«ã®åŠçãLeiningenã«éåžžã«ããå®è£
ãããŠããŸããproject.cljãã¡ã€ã«ã®:profiles
ã»ã¯ã·ã§ã³ã§å€ãã®ãããã¡ã€ã«ãå®çŸ©ããããšã«ãããéçºç°å¢ãŸãã¯æ¬çªç°å¢ã ãã§ãªããããã°ã©ã ã®äœæ¥ãéåžžã«æè»ã«åé¢ã§ããŸãã
次ã®ããã«ãä»»æã®æ°ã®ãããã¡ã€ã«ã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ã§ããŸãã
lein with-profile +windows,+selenium run
ãŸãã¯ãç®çã®ãããã¡ã€ã«ã§jarãã³ã³ãã€ã«ããŸãã
lein with-profile +windows,+phantom uberjar
ãããã«
Clojureã¯ãSeleniumãã¹ããäœæããããã®æã䟿å©ãªããŒã«ã§ããããšãææ¡ããããšæããŸãã 2ã€ã®èŠå ã®ãããã§ããã€ã³ã¿ã©ã¯ãã£ãREPLãšãç¬èªã®ç°¡æœãªDSLãµããããžã§ã¯ããäœæã§ãããã¯ãã§ãã å®è·µã瀺ãããã«ãClojureèšèªèªäœãç¥ããããã¡ãµãŒãã§DSLãæ£åžžã«äœ¿çšã§ããå ŽåããããŸãã ããã«ãããæ°ããã¹ãã·ã£ãªã¹ãããã¹ãã®äœæãšãµããŒãã«è¿
éã«ã€ãªãè¯ãæ©äŒãéãããŸãã
䟿å©ãªãªã³ã¯
Slackãã£ããã®èšäºã«å¯Ÿããæ¹å€ïŒclojure-russiaãããã
ç§ã¯ããã¹ãããžãã¯ã®ãã©ããã±ããã®èåŸã«åŒ±ãè·³ãè¿ãããšãã§ããªããšããçããæã£ãŠããŸã... ifãã«ãŒãããã©ããã±ãããªã©ã®è€éãªæ§é ã¯ããã¹ããæžãéã«æªã圢ãšèŠãªãããŸã
ãã®äŸã§ã¯ãããã¯æ¬è³ªçã«ãã®ã³ã°æ©èœã§ããããã®ãããªãã®ã¯éåžžäœããã®æœè±¡åã«ã¬ã³ããªã³ã°ãããŸã...
ãã¶ãã䟿å©ããèŠããããšããé¡æããããªããtoliãdeftestã®åšãã®è¿œå ãã¯ããæ©èœããããã©ããã®ããçš®ã®ãã°ã³ãŒããååŸããæ¹æ³ã瀺ã䟡å€ããã
ã»ãªãŒ
ãŸããŠããããã¹ããšã»ã¬ã³ãã¹ããç°ãªãããšã å®éã«ã¯ãã»ã¬ã³ãè©ŠããŠã¿ããšéåžžã«äŸ¿å©ã§ãã ã»ãšãã©ã®ãã¹ãã®å€±æã¯ãå€ãã»ã¬ã¯ã¿ãŒïŒç·šéæžã¿ïŒããŸãã¯äºæž¬ãå°é£ãªçªç¶ã®ãŽãã«ãã£ãŠãçºçãããã
ãããã
ãè€éãªæ§é ã䜿çšããªãããšããè«çã¯ãå€ãã®ãã¹ãããããå€æŽããããšãã§ããå€ãã®äººã
ãããããæžããšããäºå®ããçºå±ããŸã-ãããã£ãŠããããŒã«ã€ããŠèããæéã¯ãããŸãã-ãã¹ãã¯æåéãæçœã§ããã¹ãã§ã
å°ãªããšãç§ãç解ããŠããéã:)
ã»ã¬ã³ã®ãã¹ãã§ã¯-ãã¹ãã¯ããèªäœã§ããè€éãªã®ã§ãããã¯ããã«éèŠã§ã...
ã»ãªãŒ
ã¯ãã倧ããªæ¹åã®äœå°ããããŸãïŒæããŸã å±ããŠããŸãã
ãããã
ãŸãã¯äºæž¬ãå°é£ãªçªç¶ã®ã§ããã
çªç¶ã®ã§ããã-ããã¯ãããã«ããŠã
é£è¡é£è¡-ããã¯ã¬ããŒãä»ãã®èœäžè©Šéšã§ã
ã»ã¬ã³ã®çµã¿èŸŒã¿ã®å®è¡-å°ãæ
å ±
ããã人ã
ãã»ã¬ã³ã®åšãã«ã©ãããŒãæžãçç±ã§ã
è«çãã¹ããåçŽã§æçœãªãŸãŸã§ãããã®ããã«...
ã»ãªãŒ
ç§ã¯ããªããdsl simpleãæžãããšãã§ãããšããçµè«ã®èšäºã«æ³šæããŸãã
ãããŠäŸã§ã¯ã现ããå»ãŸããå·¥èžå
ãããã
ç§ã¯éçºè
ã§ã¯ãªããèªåèªèº«ããªãŒãã¡ãŒã·ã§ã³ãšã³ãžãã¢ã§ããããã®ããŒãã«ã€ããŠãã£ããã«ãŒã ã§æéãéãããŠããŸãã
ããã«ãæ°äººãã€ãã¡ããšãã¬ã€ã»ã±ãããŒãšã®ãã¹ãã瀺ããšããã«ãé埳çãªå±±ãããã«æ³šããŸã...
ããã§éèŠãªã®ã¯ãè¯ãããšãšæªãããšã§ã¯ãããŸãã...
ãããå®éã«ã¯ãéå
¬åŒã®èšèªã«é¢ããŠã¯å€§ããªã¡ãã»ãŒãžãããã人ã
ã¯æ¹å€ã泚ãå§ããã§ããã:)
ãããŠããã²ããŸããã®åœç©ãã§åœŒãã«äžããçç±ã¯ã
ç§ã¯ä»éå¡ããŠããã®ã§ãæ®å¿µãªããå©ããæéã¯ãããŸãã...ããããæ¥ãã§ããªããªãã1ã2é±éã®ãã¡ã®ã©ããã«ããã®èšäºãã³ããŒããããšãã§ããŸã...
motor4ik
ãããŠæãéèŠãªã±ãŒã¹ã¯èšäºã§èæ
®ãããŠããŸãããïŒ ãã¹ãã倱æãããªãã¬ã€ã§ä¿®æ£ããæ¹æ³ã¯ïŒ
ç§ãç解ããŠããããã«ãããã¯ãã©ãŒèšäºã§ãããïŒ
ã»ãªãŒ
æææ¥ã¯å
¬éãäºå®ãããŠããŸãã äžè¬çã«ããããé¢éžããå Žåã¯ã2çªç®ã®èšäºãæåºããããšãã§ããŸã
ãããŠããã¹ãçšã®DSLãã¬ãã·ã¥= P
ãããŠãä»ã§ã¯å°ããªäŸã§ãããåå¿è
ã«ã¯éåžžã«ç解ããããã§ã
PSç§ã¯ã€ã³ã¹ãã¬ãŒã·ã§ã³ãšç·šéè
ãšããŠã®ã¿è¡åããèšäºã®èè
ã¯ã»ãªãŒã§ãã