Codeceptionã® Page Objectãã¶ã€ã³ãã¿ãŒã³ã
䜿çšããã¬ãŒãã³ã®å®è£
ã®å
·äœäŸãã€ã³ã¿ãŒãããäžã§èŠã€ããããªãã£ãã®ã§ããã®ãã¿ãŒã³ã®ç¬èªã®å®è£
ã«ã€ããŠã€ã³ã¿ãŒãããã«äŒããã®ã¯
å Žéãã§ã¯ãªããšæããŸããã
ãã®èšäºã¯ãCodeceptionãŸãã¯é¡äŒŒã®ãã¬ãŒã ã¯ãŒã¯ã«ãã§ã«å°ãæ
£ããŠãããããã¹ããªããžã§ã¯ãã䜿çšããŠãã¹ããèªã¿ããããããããµããŒããç°¡çŽ åããäœåãªã³ãŒãã®éãæžããããããæ¹æ³ããŸã ç¥ããªã人ã察象ãšããŠããŸãã ããã§ããèªååãããžã§ã¯ãããŒãããçµã¿ç«ãŠããã¹ãŠã®äž»èŠãªãã€ã³ããã¹ãããããšã«èª¬æããããšããŸããã
Page Objectãã³ãã¬ãŒãã䜿çšãããšãããŒãžèŠçŽ ã䜿çšããŠäœæ¥ãã«ãã»ã«åã§ããŸããããã«ãããã³ãŒãã®éãæžããããµããŒããç°¡çŽ åã§ããŸãã UIã®ãã¹ãŠã®å€æŽã¯ç°¡åãã€è¿
éã«å®è£
ãããŸãããã®ããŒãžã説æããPage Objectã¯ã©ã¹ãæŽæ°ããã ãã§ãã ãã®ã¢ãŒããã¯ãã£ã¢ãããŒãã®ãã1ã€ã®éèŠãªå©ç¹ã¯ãHTMLãã¹ãã¹ã¯ãªããã詳现ã§æ··ä¹±ãããªãããšã§ããããã«ãããç解ãããããèªã¿ããããªããŸãã
ããã¯ãããŒãžãªããžã§ã¯ãã䜿çšããªããã¹ãã®å€èŠ³ã§ãã

ããŒãžãªããžã§ã¯ãã®äœ¿çš

åºæ¬ç°å¢ã®ã€ã³ã¹ããŒã«ã«ã€ããŠã¯èª¬æããŸãããåæããŒã¿ãæäŸããŸãã
- Ubuntuãã€ãªããã¯ããŒããŒ
- PHP 7.1.19-1
- Composer-ã°ããŒãã«ã«ã€ã³ã¹ããŒã«ãããPHPã®äŸåé¢ä¿ç®¡çãããŒãžã£ãŒ
- PhpStorm-éçºç°å¢
ãã¹ããå®è¡ããã«ã¯ã次ãå¿
èŠã§ãã
Codeceptionãå±é
Codeceptionã®ã€ã³ã¹ããŒã«ã«é²ã¿ãŸãã
ã¿ãŒããã«ã§å¿
èŠãªãã£ã¬ã¯ããªãéãããããžã§ã¯ããåéãããããããžã§ã¯ãã®ãã£ã¬ã¯ããªãäœæããŠããã«ç§»åããŸãã
mkdir ProjectTutorial cd ProjectTutorial
Codeceptionãã¬ãŒã ã¯ãŒã¯ãšãã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸãã
composer require codeception/codeception --dev

ãããžã§ã¯ãã®composer.jsonäŸåé¢ä¿ã€ã³ã¹ããŒã«ãã¡ã€ã«ã¯æ¬¡ã®ããã«ãªããŸãã
{ "require": { "php": ">=5.6.0 <8.0", "facebook/webdriver": ">=1.1.3 <2.0", "behat/gherkin": "^4.4.0", "codeception/phpunit-wrapper": "^6.0.9|^7.0.6" }, "require-dev": { "codeception/codeception": "^2.5", "codeception/base": "^2.5" } }
ãããžã§ã¯ããå±éããŸãã
php vendor/bin/codecept bootstrap

ãããžã§ã¯ãã®ã€ã³ã¹ããŒã«æ¹æ³ã®è©³çŽ°ã«ã€ããŠã¯ã
å
¬åŒããã¥ã¡ã³ããåç
§ããŠãã ãã ã
ãã®æ®µéã§ããããžã§ã¯ãã«3ã»ããã®ãã¹ããäœæãããŸãã ããã©ã«ãã§ã¯ãCodeceptionã¯ããããåãå
¥ããæ©èœãããã³ãŠãããã«åå²ããŸãã ãããã®ã»ããã«å¯ŸããŠãCodeceptionã¯3ã€ã®ymlãã¡ã€ã«ãçæããŸãã ãããã«å¿
èŠãªãã¹ãŠã®
æ§æã瀺ããã¢ãžã¥ãŒã«ãšããããã£ãæ¥ç¶ããŠãã¹ããå®è¡ããŸãã
ãã®ã¬ãã¹ã³ã¯Acceptanceãã¹ãã®äŸã«åºã¥ããŠãããããAcceptance.suite.ymlã§èšå®ãè¡ããŸãã
PHP StormïŒãŸãã¯å¥ã®ãæ°ã«å
¥ãã®éçºç°å¢ïŒã§ãããžã§ã¯ããéãã
Acceptance.suite.ymlã«ç§»åããŸãïŒããã©ã«ãã§ã¯ãtests / acceptance.suite.ymlãã©ã«ããŒã«ãããŸãïŒã
æäœéå¿
èŠãªäŸåé¢ä¿ãæžãçããåžžã«ãã©ãŒãããã«æ³šæãæããŸãã ã¢ãžã¥ãŒã«ã¯ã-ãèšå·ã§åºåãããåãã¬ãã«ã§ããå¿
èŠããããŸããããã§ãªãå Žåããã¹ãã®éå§æã«ãšã©ãŒãçºçããŸãã
å€æããïŒ
actor: AcceptanceTester modules: enabled: - WebDriver: url: 'http://yandex.ru/' // , browser: 'chrome' - \Helper\Acceptance // gherkin: contexts: default: - AcceptanceTester
ãããŠãããã€ãã®æºåäœæ¥ïŒ
ãããžã§ã¯ãã«ãŒãã«å¥ã®ãã£ã¬ã¯ããªãäœæããŸãïŒç§ã¯libãæã£ãŠããŸãïŒã
ãã®ãã£ã¬ã¯ããªã§ãå®è¡ãã¡ã€ã«run.shãäœæããŸããããã«ãããSeleniumãšChromeãã©ã€ããŒãå®è¡ãããŸãã
ããã«SeleniumãšChromeãã©ã€ããŒãé
眮ããrun.shã«runã³ãã³ããèšè¿°ããŸãã
java -jar -Dwebdriver.chrome.driver=chromedriver_241 selenium-server-standalone-3.14.0.jar
ãããžã§ã¯ãã§ã®è¡šç€ºïŒ

ã³ã³ãœãŒã«ã«æ»ããã¢ã¯ã»ã¹æš©ãå€æŽããŸãã
chmod +x ./run.sh
ïŒæ³šããã£ã¬ã¯ããªã«ãããã©ã€ããŒã®ååã¯ãstartã³ãã³ãã§æå®ãããååãšæ£ç¢ºã«äžèŽããå¿
èŠããããŸãïŒãããã«æ»ããªãããã«ãä»ããSeleniumãšWebdriverãèµ·åã§ããŸãã ãããè¡ãã«ã¯ãæ°ããã¿ãŒããã«ã¿ããéããrun.shãã¡ã€ã«ããããã£ã¬ã¯ããªã«ç§»åããŠãèµ·åã³ãã³ããèšè¿°ããŸãã
~/AutomationProjects/ProjectTutorial/lib$ ./run.sh
ãµãŒããŒãå®è¡ãããŠããããšã確èªããŸãã

å®è¡ç¶æ
ã®ãŸãŸã«ããŸãã ããã§æºåäœæ¥ã¯å®äºã§ãã
ãã¹ãã¹ã¯ãªãããæžã
ãã¹ãã±ãŒã¹ã®æ©èœãã¡ã€ã«ã®äœæã«é²ã¿ãŸãã ãããè¡ãã«ã¯ãç¹å¥ãªã³ãã³ããCodeceptionã§æäŸãããã³ã³ãœãŒã«ã§å®è¡ããŸãïŒ
cept g:feature acceptance check
ïŒããã§ãã¯ãã«æ³šæããŠãã ãã-ç§ã®ãã¹ãã®ååïŒåãå
¥ããã©ã«ããŒã«æ°ããcheck.featureãã¡ã€ã«ã衚瀺ãããŸãã

ããã©ã«ãã®ã³ã³ãã³ãã¯å¿
èŠãããŸãããããã«åé€ããŠãã¹ããäœæããŸãã
ã³ã¬ã¯ã¿ãŒãããªã«æåãèªèããããã«ãïŒlanguageïŒruã§ã¹ã¯ãªãããéå§ããããšãå¿ããªãã§ãã ããã
ãã·ã¢èªã§çãã¹ã¯ãªãããæžããŠããŸãã åæã¯ãWhenãããThenãããAndããèšå·ã*ããªã©ã®ããŒã¯ãŒãã§å§ãŸãå¿
èŠãããããšãæãåºããŠãã ããã
ç§ã®äŸã§ã¯ãYandexã®Webãµã€ããåãäžããŸããããã©ãã§ãããŸããŸããã

ãã¹ãã«å«ãŸããã¹ãããã確èªããããã«ãã¿ãŒããã«ã§ã¹ã¯ãªãããå®è¡ããŸãã
cept dry-run acceptance check.feature

ã¹ã¯ãªããã®ã¹ãããã¯ã³ã³ãœãŒã«ã«è¡šç€ºãããŸããããããã®å®è£
ã¯ãŸã å©çšã§ããŸããã
次ã«ãã¡ãœãããå®è£
ããããã®ãã³ãã¬ãŒããèªåçã«çæããã³ãã³ããå®è¡ããŸãã
cept gherkin:snippets acceptance

ã¹ã¯ãªããããåŒçšç¬Šã§å²ãŸããååã¯ãã¹ãŠãå€æ°argã«çœ®ãæããããŸãã
ããããã¿ãŒããã«ããã³ããŒãã
AcceptanceTester.phpãã¡ã€ã«ã«è²Œãä»ããŸããããã«ã¯ãããŒãžèŠçŽ ãæäœããããã®ã¡ãœããããããŸãã

ã¡ãœããã®ååãèªã¿ãããããã®æ¬è³ªãåæ ããŠïŒå¿
ãããããã§ã¯ãããŸããïŒãå®è£
ãèšè¿°ããŸãã

ãã¹ãŠãã·ã³ãã«ã§ãããã©ã€ãã©ãªã®å¿
èŠãªã³ãã³ããèŠæ±ããStormãªã©ã®ã¹ããŒããªéçºç°å¢ã§äœæ¥ããŠããå Žåã¯ããã«ç°¡åã§ãã

äœåãªéšåãåé€ããŠã¡ãœãããèšè¿°ããŸãã
public function step_beingOnMainPage($page) { $this->amOnPage('/'); } public function step_seeElement($element) { this->seeElement($element); } public function step_clickOnButton($button) { $this->click($button); } public function step_fillField($field, $text) { $this->fillField($field, $text); }
äœãèµ·ãã£ãã®ãèŠãŠã¿ãŸãããã çŸåšãå®è£
ãããŠããã¡ãœããïŒã¹ãããïŒã瀺ãããŒã ãç«ã¡äžããŸãã
cept gherkin:steps acceptance

æåïŒ
ãã ããæ©èœãã¡ã€ã«ã®æé ã¯ãŸã ã¡ãœãããšããŠèªèãããŸããã

Stormãã¹ãããã®åŠçæ¹æ³ãç解ããããã«ãåå空éGherkin ContextããContextã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããããªãã¯ãè¡ããŸãã
namespace Behat\Behat\Context { interface Context {} }
AcceptanceTesterã¯ã©ã¹ãåå空éã§ã©ããããContextããç¶æ¿ããŸã
implements \Behat\Behat\Context\Context

ããã§ãæ©èœãã¡ã€ã«ã®ãã¹ãŠã®æé ãå®è£
ã«é¢é£ä»ããããŸããã

Webdriverãäœãã¯ãªãã¯ããã©ããèŠãã¹ãããç解ããã«ã¯ãèŠçŽ ã®èªã¿åãå¯èœãªååãšããŒãžã¢ãã¬ã¹ããåŒæ°ãšããŠã¡ãœããã«åé¡ããã察å¿ãããã±ãŒã¿ãŒãšURLã«çœ®ãæããå¿
èŠããããŸãã
次ã«ããã©ãŒã ã®ãã¹ããååŸããŸãã

ãããŠãããªãã¯å®è¡ããããšãã§ããŸãïŒ
cept run acceptance

åæ Œ
çŽ ããŒãžèŠçŽ ã®ããŒãã«æéããããå Žåã¯ãç®çã®ã¡ãœããã«åŸ
æ©ãè¿œå ã§ããŸãã
$this->waitForElementVisible($element);
ãã¹ãã±ãŒã¹ã«æ»ããŸãã èŠçŽ ãšããŒãžã®æ確ãªååã®ä»£ããã«ãHTMLèŠçŽ ãšURLã衚瀺ããããšããäºå®ã«ããããã¹ãã®èªã¿ãããããã¹ãŠå€±ãããŠããããšã«åæºããŠããŸãã
ãããä¿®æ£ãããå Žåã¯ãPage Objectãã¿ãŒã³ã®å®è£
ã«ç§»ããŸãããã
ããŒãžãªããžã§ã¯ãã«ç§»å
_supportãã£ã¬ã¯ããªã§ãã¯ã©ã¹ããŒãžãé
眮ããPageãã£ã¬ã¯ããªãäœæããŸãã
php vendor/bin/codecept generate:pageobject MainPage
æåã®ããŒãžãªããžã§ã¯ãã¯Yandexã®ã¡ã€ã³ããŒãžã§ããMainPageãšåŒã³ãŸããããåãã¯ã©ã¹ãåŒã³åºããŸãã

ããã§ã¯ããªããžã§ã¯ããäœæããã«åŒã³åºããããã«ãéçãã£ãŒã«ããšã¡ãœããã宣èšããŸãã
Acceptance.suite.ymlã®æ§æã§ã¯ãéå§ããŒãžurlïŒ
yandex.ruããã§ã«ç€ºããŠãããããã¡ã€ã³ããŒãžã«ã¯æå®ããã ãã§ååã§ãã
public static $URL = '/';
次ã¯ããŒãžèŠçŽ ã®é
åã§ãã è€æ°ã®èŠçŽ ã®ãã±ãŒã¿ãŒã«ã€ããŠèª¬æããæ確ã§äžæã®ååãä»ããŸãã
次ã«ãgetElementã¡ãœãããè¿œå ããå¿
èŠããããŸãããã®ã¡ãœããã¯ãé
åã®èŠçŽ ã®ååã§ãã±ãŒã¿ãŒãè¿ããŸãã
ãã®çµæã次ã®ããšãã§ããŸãã
<?php //location: tests/_support/Page/MainPage.php namespace Page; /** */ class MainPage { public static $URL = '/'; public static $elements = array( ' ' => "//*[@id='wd-wrapper-_afisha']", ' ' => "//*[@data-statlog='afisha.title.link']", ' ' => "//*[@class='weather__icon weather__icon_ovc']|//*[@class='weather__icon weather__icon_skc_d']", ); public static function getElement($name){ return self::$elements[$name]; } }
ããã€ãã®ããŒãžã¯ã©ã¹ãè¿œå ããŸãã
/ **ãã¹ã¿ãŒ* /

/ **ãã¹ã¿ãŒ-æ€çŽ¢çµæ* /
AcceptanceTester.phpã¯ã©ã¹ã«æ»ããã¡ãœãããäœæããŸããã
ãã®äžã«PageObjectã¯ã©ã¹ããé
åãäœæããŸããããã§ãããŒãžã«ååãå²ãåœãŠãåå空éã§ã¯ã©ã¹åã瀺ããŸãã
private $pages = array( " " => "\Page\MainPage", "" => "\Page\AfishaPage", " - " => "\Page\AfishaResult" );
åæ§ã«ãæ°ããPageObjectããã®é
åã«è¿œå ãããŸãã
次ã«ãçŸåšã®ããŒãžã®PageObjectãžã®ãªã³ã¯ãä¿åããcurrentPageãã£ãŒã«ããäœæããå¿
èŠããããŸãã
private $currentPage;
ã¡ãœãããäœæããåŒã³åºããããšãã«currentPageãååŸããŠãå¿
èŠãªPageObjectã¯ã©ã¹ãåæåã§ããŸãã
ããŠãŒã¶ãŒãããŒãžã®ããŒãžåããŒãžã«ç§»åãããšãããšããæ¹æ³ã䜿çšããŠããã®ãããªã¹ããããäœæããããšã¯è«ççã§ãã 次ã«ããã§ãã¯ãªãã§PageObjectã¯ã©ã¹ãåæåããæãç°¡åãªæ¹æ³ã¯æ¬¡ã®ããã«ãªããŸãã
public function step_beingOn($page) {
次ã«ãgetPageElementã¡ãœãããèšè¿°ããŸããããã«ãããçŸåšã®ããŒãžããèŠçŽ ããŸãã¯ãã®ãã±ãŒã¿ãŒãååŸã§ããŸãã
private function getPageElement($elementName) { // $curPage = $this->currentPage; return $curPage::getElement($elementName); }

æ¢ã«å®è£
ãããŠããã¡ãœããã®å Žåãæåã«æ©èœããã¹ãããçŽæ¥åãåã£ãåŒæ°ãPageObjectã®èŠçŽ ã§çœ®ãæããå¿
èŠããããŸãã
$arg
圢ã«ãªããŸã
getPageElement($arg))
次ã«ãã¡ãœããã¯æ¬¡ã®åœ¢åŒãåããŸãã
/** * @When :page */ public function step_beingOnMainPage($page) { // pageObject $this->currentPage = $this->pages[$page]; $curPage = $this->currentPage; $this->amOnPage($curPage::$URL); } /** * @Then :element */ public function step_seeElement($element) { $this->waitForElementVisible($this->getPageElement($element)); $this->seeElement($this->getPageElement($element)); } /** * @Then :button */ public function step_clickOnButton($button) { $this->click($this->getPageElement($button)); } /** * @Then :field :text */ public function step_fillField($field, $text) { $this->fillField($this->getPageElement($field), $text); } /** * @Then :field */ public function step_deleteText($field) { $this->clearField($this->getPageElement($field)); }
EnterããŒãæŒããŠæ€çŽ¢çµæã衚瀺ããå¥ã®æ¹æ³ãè¿œå ããŸããã
public function step_keyboardButton() { $this->pressKey('//input',WebDriverKeys::ENTER); }
æåŸã®ã¹ãããã¯ãå¿
èŠãªãã¹ãŠã®ã¡ãœãããšPageObjectsãèšè¿°ããããããã¹ãèªäœããªãã¡ã¯ã¿ãªã³ã°ããå¿
èŠããããŸãã æ°ããããŒãžã«ç§»åãããšãã«PageObjectãåæåããã¹ããããè¿œå ããŸãã ãã®ã*ãŠãŒã¶ãŒã¯ããŒãžã«ã¢ã¯ã»ã¹ããŸããïŒããŒãžãããããŸãã
æ確ã«ããããã«ãããã«ããã€ãã®æé ãè¿œå ããŸãã çµæã¯ãã®ãã¹ãã§ãïŒ
#language: ru : : . . . " " " " " " " " "" " " " " ENTER " - " " " " " " " "" ENTER
ãã®ãããªãã¹ãã·ããªãªã¯ãéšå€è
ã«ãšã£ãŠç解å¯èœã§èªã¿ããããã®ã§ãã
çºå°ïŒ
ãã詳现ãªå®è¡çµæã衚瀺ããã«ã¯ã次ã®ã³ãã³ãã䜿çšã§ããŸã
cept run acceptance --debug
çµæãèŠãŠã¿ãŸãããïŒ

ãããã£ãŠãããŒãžãªããžã§ã¯ããã¿ãŒã³ã䜿çšãããšããã¹ãŠã®ããŒãžèŠçŽ ããã¹ãã¹ã¯ãªããããåé¢ããããããåå¥ã®ãã£ã¬ã¯ããªã«ä¿åã§ããŸãã
ãããžã§ã¯ãèªäœã¯
https://github.com/Remneva/ProjectTutorialã§èŠã€ããããšãã§ã
ãŸãæåã®èªååãšã³ãžãã¢ãšããŠãã¢ã€ãã¢ãå
±æããŠããã ããã°å¹žãã§ãããããŠãããããããããžã§ã¯ãæ§é ãå¯èœãªéãè«ççã«å€æããã³ç°¡çŽ åããæ¹æ³ãæããŠãã ããã