ããã«ã¡ã¯ãã³ãããã§PHPæ¸ããããã¦ãã¾ãéå(@o0h_)ã¨ãããã¾ããçé¾è¶ã好ãã§ãã
(ãã¹ãèªååããããã®å¼ç¤¾å
ã«ãããã¤ã¡ã¼ã¸)
çªç¶ã§ããï¼
çããããèªåã®å®è£
ã«ã¤ãã¦ãã¾ãã¡èªä¿¡ãæã¦ãªãæã¯ãããã¾ãã¬ãã
ããã®å®è£
ã»ã»é ããããä¸å®ã»ã»ç ããªãå¤ã»ã»ã»ã»ããããªæ°åã§æ¯æ¥ãéããã¦ãã¾ãããï¼
ã誰ãã«è¨±ãã¦æ¬²ãããå®å¿ããã ãããã
ãããªæã¯ãã¹ããæ¸ãã¾ããããç·è²ã好ããªäººããã®çéã«ã¯ç§ã ãã§ã¯ãªãã¯ãã§ãï¼
ãã ãã©ããã¦ãæ¤æ»ãã¥ãããªãã©ããã£ã¦è©¦ãã°è¯ãããªãã¨æ©ã¾ããæãããã®ã§ã¯ãªããã¨ã
ãã¨ã³ãã¦ã¼ã¶ã¼ãç´æ¥è§¦ãã®ã£ã¦ãã©ã¦ã¶ã§ãããã ã£ããå®éã«ãã©ã¦ã¶ã使ã£ãæä½ãæ»ããªãå¯è½ãªãåé¡ãªãããã»ã»ãã¨ããèãããã¨ããã¾ãããï¼
ããã§éå ã¡ããããã°ã©ãã¯ãã½ã¡ã½ã¡ã¨http://localhostãéããGoogle Chromeããã¦ã¹ã§å¼ã£ã¦ãæã®éã®å¹³ç©ãå¾ãã®ã§ãã(身ã«è¦ããããã¾ã)
ãã ãããã£ã¦æãããé¢åããããä¸å®å®ã ã絶対ã«æ¯åãããªãæé ã§ãã
誰ãåæã«ãã£ã¦ããï¼
ãããSeleniumã§ã§ããã
ããã©ã¦ã¶ã®æä½ãããã°ã©ããã«ã«ãããããããPHPã§æ¸ããããã
ãããå®ç¾ããæè¡ããããã¾ãã
ç¾èã¯ä¸è¦ã«ããããã¨ãããã¨ã§ãPHPããã©ã¦ã¶ãåããã¦ãããµãããå®éã«ã覧ãã ããã
æåã«CakePHPã®ãã¹ãã³ãã³ããå®è¡ããã以éã¯ããã¼ãã¼ãããã¦ã¹ãä¸å触ã£ã¦ãã¾ããããããã£ããããã¼ã¸ãéãã¦âæå®ããè¦ç´ ãã¯ãªãã¯ãã¦âãã©ã¼ã ã«å¤ãå
¥åãã¦âéä¿¡ãã¿ã³ãæ¼ãã¦âãã©ã¼ã ã®éä¿¡çµæãã¿ããã¨ããæä½åã³æ¤æ»ãã§ããã®ã§ãã
ããããé常ã«ã·ã³ãã«ãã¤çãè¡æ°ã®ã³ã¼ãã§å®ç¾ã§ï¼ï¼
å®éã«ä¸è¨åç»ã«ã¦å©ããã³ã¼ããåç
§ããªããããç´¹ä»ãããã¨æãã¾ãã
ãã®éã«ç¨ããã®ãããSeleniumãã¨ãphp-webdriverãã§ãã
ãã®åéã¯RubyãnodeJSã«ãããã¤ã³ãã£ã³ã°ãæåãªãããªæ°ããã¾ãããPHPã«ããå®è£
ãFacebookã«ãã£ã¦è¡ããã¦ãããã®ãåå¨ãã¾ãã
ãã®è¨äºã¯ã©ããªäººåãï¼
- Seleniumã£ã¦ä½ï¼ / php-webdriverã£ã¦ä½ï¼ã¨ãã人
- CakePHPã使ã£ã¦ãã¦ããã©ã¼ã ã®åä½ç¢ºèªã¨ããã¡ãã¡é¢åãããããï¼ã¨æã£ã¦ãã人
- CakePHPã§ã®ãã¹ã(PHPUnit)ã«ã¤ãã¦ä½¿ãæ¹ãåããããããã¯å®éã«æ¸ãããã¨ããã人
Selenium / php-webdriverã£ã¦ä½ï¼
Selenium ããã«ãã
Selenium - Web Browser Automation http://www.seleniumhq.org/
ããããã»ã»ã»Seleniumã£ã¦ä½ã§ããï¼ã¨ããæ¹ããããã¨æãã¾ãããã°ã°ã£ã¦è¦ãã¨æå¤ã¨ç«¯çã«ãä½ãã§ãããã¨ç´¹ä»ãã¦ããè¨äºã£ã¦ãªããã®ã§ããã
極端ã«ç«¯æã£ãè¨ãæ¹ãããã°ã
- ããã°ã©ã ãä»ãã¦ãã©ã¦ã¶ãæä½ã§ãã(URLãæå®ãã¦ãã¼ã¸ãéããããããã¥ã¡ã³ãä¸ã®è¦ç´ ãã¯ãªãã¯ããã)
- ããã£ã¦ã¤ã¾ããJavaScriptã¨ãå¤é¨ãªã½ã¼ã¹ã®DLã¨ãiframeã¨ããå®å ¨ã«åä½ããã£ã¦äºï¼
- âã®æä½ã®çµæãæ¤æ»ã§ãã
- ã¯ãªãã¯ãããAPIå©ãã¦æåããããhogehogeãã£ã¦è¡¨ç¤ºããããã ãã©ã»ã»ã»ã§ãã¦ãããªï¼ã¨ã
ãªã©ã¨ãã£ãäº(ã®èªåå)ãå®ç¾ã§ãã¾ã
Seleniumèªä½ã¯Javaã®ãã¼ã«ãªã®ã§ããããå©ç¨ããããã®è²ã
ãªè¨èªã§ã®ãã¤ã³ãã£ã³ã°ãããã¾ãã
ããå°ãå³å¯ã«è¨ãã¨ããSelenium Standalone Serverãç«ã¡ä¸ãã¦ããåè¨èªã®å®è£
ããããã®APIãå©ããã¨ãã£ãæ§é ã§ãã
ã§ã¯ãPHPã§ã¯ã©ã®ããã«ãã¦æ±ãã®ã§ããããï¼
php-webdriver ã´ã¼ããã¡ã´ã¼ã»ããã¶ã©ããã°ã¼
facebook/php-webdriver https://github.com/facebook/php-webdriver
ããã¤ãå®è£ ãåå¨ãã¦ãã¦ãã¾ãPHPUnitã®ãã©ã°ã¤ã³ãåå¨ããã®ã§ãããç§ãã¡ã®ãã¼ã ã§ã¯Facebookã«ããPHP Webdriverãå©ç¨ãã¦ãã¾ããåç´ã«ãã¹ãç®çã§ç¨ãããªãPHPUnitã®ãã©ã°ã¤ã³ã§ååããç¥ãã¾ããããéãã¹ã以å¤ã®ãã¼ã«ãã¦ã¼ãã£ãªãã£ãå®è£ ããéã«ãæ´»ç¨ãããããããã¦ãã¡ãã好ãã§ããå½¢ã§ãã
ã³ã¼ãã¨ã
ä»åã¯CakePHPã®ãã¹ãã±ã¼ã¹ã«Seleniumã«ããæ¤æ»ãåãè¾¼ããã¨ãããã¼ãã§ã®å®è£
ãè¡ãã¾ããã
ãã¢ã¢ããªã¨ãã¦ããFacebookãã°ã¤ã³ãã¦ã¦ã¼ã¶ã¼æ
å ±ã表示ãããã¨ãããã®ã§ãã
UsersController::login()
- ãã°ã¤ã³åã®ãã¼ã¸ããã°ã¤ã³ãã¿ã³ããã
UsersController::login_callback()
- Facebookãã°ã¤ã³å¾ã®ã³ã¼ã«ããã¯å ãèªè¨¼ãä»ãã¦ã¦ã¼ã¶ã¼æ å ±ã表示ãã
ã ãã®è³ã£ã¦ã·ã³ãã«ãªãã®ã«ãªãã¾ãã
ã³ã¬ã«å¯¾ãã¦ãå
ã®ãã¢åç»ã®ãããªæ¯ãèãããããããã«å®è£
ããããã¹ãã³ã¼ããã®å
¨å®¹ãä¸è¨ã§ãã
ããã ãï¼å ·ä½çã«è¦ã¦è¡ãã¾ãããã
use Facebook\WebDriver as FbDriver; use Facebook\WebDriver\Remote as FbRemote;
é·ã£ããããã®ã§åå空éã®ã¨ã¤ãªã¢ã¹ãè¨å®ãã¦ãã¾ãã
$host = 'http://localhost:4444/wd/hub'; $driver = FbRemote\RemoteWebDriver::create($host, FbRemote\DesiredCapabilities::chrome());
ãã©ã¦ã¶(ããã§ã¯Chrome)ãç«ã¡ä¸ãã¾ããååãã¾ããªãã¿ãããªãã®
$driver->get('http://localhost:8080');
ã¢ããªã±ã¼ã·ã§ã³ã®ããããã¼ã¸ãéãã¾ã($driver->get()
ã«ä»»æã®URLã渡ã)ã
ä»å㯠8080çªã§ç«ã¡ä¸ãã¦ããã®ã§ããã®ãããªè¨è¿°ã«ã
$driver->findElement(FbDriver\WebDriverBy::linkText('click to login!'))->click();
éãããã¼ã¸ä¸ãã
- ãclick to login!ãã¨æ¸ããã¦ãããªã³ã¯(
FbDriver\WebDriverBy::linkText()
) - ãæ¢ãåºãã¦(
$driver->findElement()
) - ã¯ãªãã¯ãã(
->click()
)
ããã§Facebookã«é·ç§»ãã¾ãã
$driver->wait(300, 500)->until( FbDriver\WebDriverExpectedCondition::presenceOfElementLocated(FbDriver\WebDriverBy::cssSelector('#email')) );
ãã¼ã¸é·ç§»ãããéã«ãèªã¿è¾¼ã¿ãå®äºããã®ãå¾
ã¡ããã§ãããããããä¿è¨¼ãããªãã¨ããæå®è¦ç´ ãã¯ãªãã¯ããªã©ã®æä½ãä¸å¯è½ã§ã(Webdriverçã«ã¯ãåå¨ããªãè¦ç´ ã«å¯¾ããæä½ã¯ä¾å¤ãæãã¾ã)ã
ãã®ã$driver->wait()
ãã¯ã¾ãã«ãæºåãã§ããã®ãå¾
ã¤ãããã®ãã®ã§ãï¼(å¬ãã)
ããã§ã¯
- æ大300ç§å¾ ã¤ããã®é500msã§ãªãã©ã¤ãã(åä½æ³¨æ!! â åè)
- å¾
ã¤ã®ã¯ã
#email
ã¨ããè¦ç´ ãèªã¿è¾¼ã¾ããåå¨ãããã¨ããç¶æ
ãä¿è¨¼ãã¦ãã¾ããããªãã¡ããFacebookã®ãã°ã¤ã³ãã©ã¼ã ãèªã¿è¾¼ã¾ãã¦ãããç¶æ ã«ãªãã¾ããã
$driver->findElement( FbDriver\WebDriverBy::cssSelector('#email') )->click(); $driver->getKeyboard()->sendKeys(FB_TEST_USER_EMAIL); $driver->findElement( FbDriver\WebDriverBy::cssSelector('#pass') )->click(); $driver->getKeyboard()->sendKeys(FB_TEST_USER_PASS); $driver->findElement( FbDriver\WebDriverBy::cssSelector('#loginbutton input[type=submit]') )->click();
emailã¨passãå
¥åãããã°ã¤ã³ãã¿ã³ãã¯ãªãã¯ã
ãã°ã¤ã³ã«æåããã¨ããã¦ã¼ã¶ã¼æ
å ±è¡¨ç¤ºãã¼ã¸(login_callback
)ãã«æ»ãã¾ãã
$testUserFbId = '146765462327498'; $this->assertEquals( $testUserFbId, $driver->findElement(FbDriver\WebDriverBy::cssSelector('#id'))->getText(), 'ãã°ã¤ã³å¾ãé©åã«ã¦ã¼ã¶ã¼ã®FacebookIDã表示ããã¦ãã' );
$driver->findElement($hoge)->getText()
ã§ãé¸æããDOMã®innerTextãåå¾ãã¾ããããã«å¯¾ããé常éãstringã®ã¢ãµã¼ã·ã§ã³ããããããã°ã¤ã³ãã¦æ
å ±ãæ£å¸¸ã«åå¾ã§ãã¦ããããã¨ãæ¤æ»ãã¦ãã¾ãã
$driver->close();
ãã©ã¦ã¶ãéãã¾ãããç²ãæ§ã§ããï¼
以ä¸ã«ãªãã¾ãããããªã¨ããã§ããããã«ç°¡æ½ã«ãå¼·åãªãã©ã¦ã¶ãã¹ããå®ç¾ã§ããããã¨ããçé±ãæãã¦ããã ããã®ã§ã¯ãªããã¨æãã¾ãã ã°ããã¤ã»ç®è¦ï¼ï¼ï¼ï¼
ãããã«
ãããã ã£ãã§ããããï¼
ç¹ã«å¥ããã¸ã§ã¯ãã¨ã®é£æºçã§ãã©ããã¦ãã¢ããªå¤ã®ãµã¤ããããããªãã¦ã¯ãããªãï¼ã¨ããæã«ã¯ããã¯ããã©ã¦ã¶ä¸ã§ã®åä½ãã¨ã£ã¦ããã®ãå®å¿æãä¿ã¦ããæ¤è¨¼ã³ã¼ãã®å®è£
ã³ã¹ããæããããããªãã¨å®æãã¦ãã¾ãã
é åçã«ã¯UnitTestã§ã¯ãªãã§ããããå®éãæ¯ãèããã¹ãããã·ããªãªæ¸ããããã¦ãã¨ããã£ãææ³ã¨ç¸æ§ãè¯ãã®ããªãã¨æã£ã¦ãã¾ããéãè¦ã¦ã@sizuhikoããã®ããã¸ã§ã¯ãã§ããsizuhiko/Bddãªã©ã試ãã¦ã¿ãããªãã¨ã¯é·ããä¼ãã§ãã¾ãï¼
ã¾ããå®éã«CIã«çµã¿è¾¼ãå ´åã«ã¯ãããããããããã¬ã¹åããè¡ã£ã¦ãã£ã¹ãã¬ã¤ãæããªãç°å¢ã§ãåä½ããããã«ãã¦ããã(cf: Xvfb)å¿ è¦ãã Selenium Webdriverèªä½ã®èµ·åãèªååãã¦ã»ã»ã»ã¨ãã£ãæºåãå¿ è¦ã«ãªãã®ãã¨æãã¾ãã
ä»åã¯è§¦ãã¦ãã¾ããããä»ã«ã
- éãã¦ãããã¼ã¸ã®ã¹ã¯ãªã¼ã³ã·ã§ãããåã£ã¦æ¸ãåºã
- æå®ããè¦ç´ ã®å 容(htmlãinnertext)ãåå¾ãã
- æå®ããè¦ç´ ã®ã¹ã¿ã¤ã«(positionãdisplayã®ã¹ãã¼ã¿ã¹ç)ãæ¤æ»ãã
ã¨ãã£ãAPIãç¨æããã¦ããã夢ãåºãããªãã¨ããæãããã¦ãã¾ãï¼
å人çã«ã¯ãåãã¦ç¥ã£ãæã«ã¯ãä½ã³ã¬ãããã¢ãããããã¨ç¤¾å
ã§å«ã³ã»æã¡éãã»ç«ã¡ä¸ããã»ã®ããã¡åã£ãè¨æ¶ãã»ã»ã»æªã æ°é®®ã«è³å
ã«å»ã¾ãã¦ããã¾ãã
ä»ã¾ã§è§¦ãããã¨ããªãã£ãã»ç¥ããªãã£ãã¨ããæ¹ããã¾ãããããããæ©ã«æ¯éãã©ã¤ãã¦ã¿ã¦ãã ãããï¼
å¼ç¤¾ã§ã¯ãã¾ã è¦ã¬ãã¼ã«ãæ¢ãã ãã¦æ¶ãèªãåã仲é(ãã å)ããä¸çã§æãå½±é¿åã®ãã人æãåéãã¦ãã¾ãï¼âï¼ ï¼âï¼
ã«ã¸ã¥ã¢ã«ãªæ°æã¡ã§ããªãã£ã¹ã¾ã§éã³ã«æ¥ã¦ãã ãããï¼
Wantedlyçµç±ã§ãCTOã¨æ¡æ!!
ãã¾ã1: ã»ããã¢ããã«ã¤ãã¦
æ¬è¨äºã§ã¯PHPã¢ããªã±ã¼ã·ã§ã³ã®å®è£ ãä¸å¿ã«è¨è¿°ããã¾ããããä¸è¨ã®ãã¹ãã³ã¼ããåããã«å½ãã£ã¦ã¯ä»¥ä¸ã®2ç¹ã®æºåãå¿ è¦ã«ãªãã¾ãã
- Selenium Webdriverãã¤ã³ã¹ãã¼ã«ãããç«ã¡ä¸ãã£ã¦ãã
- PHPUnit マニュアル – 第13章 PHPUnit と Seleniumã®å 容ãåèã«ãªããã¨æãã¾ãã
- ç°å¢ã«ãã£ã¦ã¯ãæ£å¸¸ã«å©ãããã«ã¯(.bashrcçã§)
export DISPLAY=:0
ã¨ç°å¢å¤æ°ãè¨å®ãã¦ããå¿ è¦ãããããç¥ãã¾ãããSeleniumã¯ç«ã¡ä¸ãããã®ã®ãã©ã¦ã¶ãç«ã¡ãããããªãã»ã»ã¨ããç¶æ³ã«ãªãã¾ãã
- php-webdriverãè¨ç½®ããã¦ãã
- composerçµç±ã§ã¤ã³ã¹ãã¼ã«å¯è½ã§ããä»åã®ã¢ããªã±ã¼ã·ã§ã³+ãã¹ãç¨ã®composer.jsonã¯ãã¡ãã«ç½®ãã¦ããå 容ãå©ç¨ãã¦ããã®ã§ããåèã«ãã¦ãã ãã
ãã¾ã2: Selenium + php-webdriverã®ããã®åèãªã³ã¯
Seleniumé¢é£
- Selenium WebDriverã§Webã¢ããªã®ãã¹ããå¤ãã ï¼ IT
- Selenium WebDriverã®å®è·µå ¥éçãªè¨äºã§ããããå¤ãã§ãããæ¦è¦³ãæ´ããã¨æãã¾ã
- CentOS6.4 + Selenium ã®ç°å¢ä½æ - Qiita
- æ¬è¨äºä¸ã§Xvfbã®å°å ¥ã«ã¤ãã¦è¨åãã¦ããªãã®ã§ãåèã«ã
php-webdriveré¢é£
- facebook/php-webdriver
- php-webdriverã®ã¬ãã¸ããª
- API Documentation
- åã¬ãã¸ããªã®APIããã¥ã¡ã³ãããã ããèªåçã«ããã¥ã¡ã³ãã¼ã·ã§ã³ããããã®ã§ãã¡ã½ãããã¯ã©ã¹ã®æ§é ãç¥ããã¨ãåºæ¥ãç¨åº¦ã§ãå ·ä½çãªæ¯ãèãçãç¥ãã«ã¯å°ãå³ããããªã»ã»ï¼ã¨ããå°è±¡ã§ã
- Working with PHPUnit and Selenium Webdriver
- ãµã³ãã«ã¢ããªã±ã¼ã·ã§ã³ã®ç´¹ä»è¨äºã
- ç¾å¨ã§ã¯ãã®è¨äºã®ã³ã¼ãã¯ãã®ã¾ã¾ã§ã¯åããªãã§ãããåè¦æã«å¤§ãã«åèã«ããã¦ããã ãã¾ããã