
ããã«ã¡ã¯ãHabrïŒ ç€Ÿå ã»ãããŒã§ãç§ã®ãªãŒããŒãã€ãŸããã¹ãéšéã®è²¬ä»»è ããããã¹ãã¯äžèŠããšããèšèã§ã¹ããŒããå§ããŸããã ããŒã«ã§ã¯ã誰ããéãã§ãæ€ åããèœã¡ãããšãã人ãããŸããã 圌ã¯èããç¶ããŸããããã¹ããªãã§ã¯ãè€éã§é«äŸ¡ãªãããžã§ã¯ããäœæããããšã¯ããªãå¯èœã§ãã ãããŠããããããããã¯åäœããŸãã ãããã補åãæ£åžžã«æ©èœããããšãç¥ã£ãŠãããªããã©ãã»ã©èªä¿¡ãæãããæ³åããŠã¿ãŠãã ããã
Badooã®ãªãªãŒã¹ã¯ããªãäžè¬çã§ãã ããšãã°ããµãŒããŒéšåãšãã¹ã¯ãããWebã¯1æ¥ã«2åãªãªãŒã¹ãããŸãã ãã®ãããè€éã§äœéãªãã¹ããéçºã®é害ã«ãªãããšãçŽæ¥ç¥ã£ãŠããŸãã ç°¡åãªãã¹ãã¯å¹žçŠã§ãã ããã§ãä»æ¥ã¯ãBadooãã©ã®ããã«ç ãã¹ããè¡ã£ãŠãããã«ã€ããŠã話ããŸãã
ç æ€æ»ãšã¯
ãã®çšèªã¯ããªãŒãã³ãçµã¿ç«ãŠããã¹ãŠã®ãã©ã°ãéãããããfloodæ¿«ãããç ãæå³ããå Žæããã®ã¿æ¥ãããšãèŠãã¹ããŒãã¡ãŒã«ãŒã«ãã£ãŠæåã«äœ¿çšãããŸããã ãŠã£ãããã£ã¢
å ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¹ã¢ãŒã¯ãã¹ãã¯æãåçŽã§æçœãªã±ãŒã¹ããã¹ãããããã«èšèšãããŠããããããªãã§ã¯ä»ã®ã¿ã€ãã®ãã¹ãã¯äžåœã«åé·ã«ãªããŸãã
ç°¡åãªäŸãèŠãŠã¿ãŸãããã ã¢ããªã±ãŒã·ã§ã³ã®ããªãããã¯ã·ã§ã³ã¯bryak.comã«ãããŸãïŒå®éã®ãµã€ããšã®å¶ç¶ã®äžèŽã¯ã©ã³ãã ã§ãïŒã ãã¹ãçšã«æ°ãããªãªãŒã¹ãæºåããŠã¢ããããŒãããŸããã æåã«ç¢ºèªãã䟡å€ããããã®ã¯äœã§ããïŒ ã¢ããªã±ãŒã·ã§ã³ããŸã éããŠããããšã確èªããããšããå§ããŸãã WebãµãŒããŒãã200ãã§å¿çããå Žåããã¹ãŠãæ£åžžã§ãããæ©èœã®ãã§ãã¯ãéå§ã§ããŸãã
ãã®ãããªãã§ãã¯ãèªååããæ¹æ³ã¯ïŒ ååãšããŠããã©ãŠã¶ãèµ·åããç®çã®ããŒãžãéããå¿ èŠãªãšããã«è¡šç€ºãããããšã確èªããæ©èœãã¹ããäœæã§ããŸãã ãã ãããã®ãœãªã¥ãŒã·ã§ã³ã«ã¯ããã€ãã®æ¬ ç¹ããããŸãã ãŸããããã¯é·ããã®ã§ãããã©ãŠã¶ãèµ·åããããã»ã¹ã¯ãæ€èšŒèªäœãããæéãããããŸãã 第äºã«ãããã«ã¯è¿œå ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã®ä¿å®ãå¿ èŠã§ãããã®ãããªç°¡åãªãã¹ãã®ããã«ããã©ãŠã¶ãåãããµãŒããŒãã©ããã«ç¶æããå¿ èŠããããŸãã çµè«ïŒåé¡ãç°ãªãæ¹æ³ã§è§£æ±ºããå¿ èŠããããŸãã
åããŠã®ç ãã¹ã
Badooã§ã¯ããµãŒããŒåŽã¯ã»ãšãã©ãPHPã§èšè¿°ãããŠããŸãã æãããªçç±ã§ãåäœãã¹ãã¯ããã«æžãããŠããŸãã ãããã£ãŠããã§ã«PHPUnitããããŸãã æè¡ãäžå¿ èŠã«çæããªãããã«ãPHPã§ãç ãã¹ããäœæããããšã«ããŸããã PHPUnitã«å ããŠãURLãæäœããããã®ã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªïŒlibcurlïŒãšããããæäœããããã®PHPæ¡åŒµæ©èœã§ããcURLãå¿ èŠã§ãã
å®éããã¹ãã¯ãµãŒããŒã«å¿ èŠãªèŠæ±ãè¡ããçãã確èªããã ãã§ãã ãã¹ãŠãgetCurlResponseïŒïŒã¡ãœãããšããã€ãã®ã¿ã€ãã®ã¢ãµãŒã·ã§ã³ã«é¢é£ä»ããããŠããŸãã
ã¡ãœããèªäœã¯æ¬¡ã®ããã«ãªããŸãã
public function getCurlResponse( $url, array $params = [ 'cookies' => [], 'post_data' => [], 'headers' => [], 'user_agent' => [], 'proxy' => [], ], $follow_location = true, $expected_response = '200 OK' ) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if (isset($params['cookies']) && $params['cookies']) { $cookie_line = $this->prepareCookiesDataByArray($params['cookies']); curl_setopt($ch, CURLOPT_COOKIE, $cookie_line); } if (isset($params['headers']) && $params['headers']) { curl_setopt($ch, CURLOPT_HTTPHEADER, $params['headers']); } if (isset($params['post_data']) && $params['post_data']) { $post_line = $this->preparePostDataByArray($params['post_data']); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_line); } if ($follow_location) { curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); } if (isset($params['proxy']) && $params['proxy']) { curl_setopt($ch, CURLOPT_PROXY, $params['proxy']); } if (isset($params['user_agent']) && $params['user_agent']) { $user_agent = $params['user_agent']; } else { $user_agent = USER_AGENT_DEFAULT; } curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); $response = curl_exec($ch); $this->logActionToDB($url, $user_agent, $params); if ($follow_location) { $this->assertTrue( (bool)$response, 'Empty response was received. Curl error: ' . curl_error($ch) . ', errno: ' . curl_errno($ch) ); $this->assertServerResponseCode($response, $expected_response); } curl_close($ch); return $response; }
ã¡ãœããèªäœã¯ãæå®ãããURLã§ãµãŒããŒå¿çãè¿ãããšãã§ããŸãã å ¥åã¯ãCookieãããããŒããŠãŒã¶ãŒãšãŒãžã§ã³ããããã³ãªã¯ãšã¹ãã®äœæã«å¿ èŠãªãã®ä»ã®ããŒã¿ãªã©ã®ãã©ã¡ãŒã¿ãŒãåãå ¥ããŸãã ãµãŒããŒããã®å¿çãåä¿¡ãããšãã¡ãœããã¯å¿çã³ãŒããäºæããããã®ãšäžèŽããããšã確èªããŸãã ããã§ãªãå Žåããããå ±åãããšã©ãŒã§ãã¹ããã¯ã©ãã·ã¥ããŸãã ããã¯ã転åã®åå ãç¹å®ããããããããã§ãã ãã¹ããäœããã®ã¢ãµãŒãã«è©²åœããããŒãžã«èŠçŽ ããªãããšãäŒãããšããšã©ãŒã¯ãå¿çã³ãŒããäºæ³ãããã200ãã§ã¯ãªãã404ãã§ãããšããã¡ãã»ãŒãžãããæ å ±éãå°ãªããªããŸãã
èŠæ±ãéä¿¡ãããå¿çãåä¿¡ããããšãèŠæ±ããã°ã«èšé²ããããããå°æ¥ãå¿ èŠã«å¿ããŠããã¹ããã¯ã©ãã·ã¥ãŸãã¯äžæããå Žåã«äžé£ã®ã€ãã³ããç°¡åã«åçŸã§ããŸãã ããã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãã
æãç°¡åãªãã¹ãã¯æ¬¡ã®ããã«ãªããŸãã
public function testStartPage() { $url = 'bryak.com'; $response = $this->getCurlResponse($url); $this->assertHTMLPresent('<body>', $response, 'Error: test cannot find body element on the page.'); }
ãã®ãããªãã¹ãã¯1ç§æªæºã§åæ ŒããŸãã ãã®éã«ãéå§ããŒãžãã200ãã§å¿çãããã®äžã«bodyèŠçŽ ãããããšã確èªããŸããã åãæåãåããŠãããŒãžäžã®èŠçŽ ãããã€ã§ã確èªã§ããŸãããã¹ãã®æéã¯ããã»ã©å€ãããŸããã
ãã®ãããªãã¹ãã®ãã©ã¹ïŒ
- é床-ãã¹ãã¯å¿ èŠã«å¿ããŠäœåºŠã§ãå®è¡ã§ããŸãã ããšãã°ãã³ãŒããå€æŽããããã³ã«ã
- åäœããããã«ç¹å¥ãªãœãããŠã§ã¢ãšãââãŒããŠã§ã¢ãå¿ èŠãšããªãã§ãã ããã
- äœæãšä¿å®ãç°¡åã§ãã
- 圌ãã¯å®å®ããŠããŸãã
æåŸã®æ®µèœã«ã€ããŠã ã€ãŸãããããžã§ã¯ãèªäœãšåããããå®å®ããŠããŸãã

ãã°ã€ã³
æåã®ç ãã¹ããæžããŠãã3æ¥ãçµéãããšæ³åããŠãã ããã ãã¡ããããã®éããã¹ãã§èŠã€ãã£ããã¹ãŠã®äžæ£ããŒãžãã«ããŒããŸããã ç§ãã¡ã¯å°ãåãã§åº§ããŸãããããããžã§ã¯ãã§æãéèŠãªããšã¯ãã¹ãŠèªå¯ãããŠããããšã«æ°ä»ããŸããã ããããã¹ãããæ©äŒãåŸãæ¹æ³ã¯ïŒ

èš±å¯ãããããŒãžãšèš±å¯ãããŠããªãããŒãžã®éãã¯äœã§ããïŒ ãµãŒããŒã®èŠ³ç¹ããèŠããšããã¹ãŠãåçŽã§ãããŠãŒã¶ãŒãèå¥ããããã®æ å ±ããªã¯ãšã¹ãã«å«ãŸããŠããå Žåãèš±å¯ãããããŒãžãè¿ãããŸãã
æãç°¡åãªãªãã·ã§ã³ã¯èªèšŒCookieã§ãã ãªã¯ãšã¹ãã«è¿œå ãããšããµãŒããŒã¯ãèªèããŸããã ãã®ãããªCookieã¯ãåç¶æéãéåžžã«é·ãå Žåããã¹ãã§ããŒãã³ãŒãã£ã³ã°ã§ããŸãããèªèšŒããŒãžã«ãªã¯ãšã¹ããéä¿¡ããããšã§èªåçã«åä¿¡ã§ããŸãã 2çªç®ã®ãªãã·ã§ã³ã詳ããèŠãŠã¿ãŸãããã
ç§ãã¡ã®ãµã€ãã§ã¯ãèªèšŒããŒãžã¯æ¬¡ã®ããã«ãªããŸãã

ãŠãŒã¶ãŒã®ãŠãŒã¶ãŒåãšãã¹ã¯ãŒããå ¥åããå¿ èŠããããã©ãŒã ã«èå³ããããŸãã
ä»»æã®ãã©ãŠã¶ãŒã§ãã®ããŒãžãéããã€ã³ã¹ãã¯ã¿ãŒãéããŸãã ãŠãŒã¶ãŒããŒã¿ãå ¥åãããã©ãŒã ãéä¿¡ããŸãã
ã€ã³ã¹ãã¯ã¿ã«ãªã¯ãšã¹ãã衚瀺ãããã®ã§ããã¹ãã§ã·ãã¥ã¬ãŒãããå¿ èŠããããŸãã æãããªïŒãã°ã€ã³ãšãã¹ã¯ãŒãïŒã«å ããŠãã©ã®ããŒã¿ããµãŒããŒã«éä¿¡ããããã確èªã§ããŸãã ãããžã§ã¯ãããšã«ç°ãªããŸãããªã¢ãŒãããŒã¯ã³ã以åã«åä¿¡ããCookieã®ããŒã¿ããŠãŒã¶ãŒãšãŒãžã§ã³ããªã©ã§ãã ãããã®åãã©ã¡ãŒã¿ãŒã¯ãæ¿èªèŠæ±ãäœæããåã«ãã¹ãã§ååŸããå¿ èŠããããŸãã
ä»»æã®ãã©ãŠã¶ãŒã®éçºè ããŒã«ã§ãcURLãšããŠã³ããŒãéžæããããšã«ããããªã¯ãšã¹ããã³ããŒã§ããŸãã ãã®ãã©ãŒã ã§ã¯ãã³ãã³ããã³ã³ãœãŒã«ã«æ¿å ¥ããŠè¡šç€ºã§ããŸãã ããã§ããã©ã¡ãŒã¿ãå€æŽãŸãã¯è¿œå ããŠãã¹ãã§ããŸãã

ãã®ãããªãªã¯ãšã¹ãã«å¿ããŠããµãŒããŒã¯Cookieãè¿ããŸããCookieã¯æ¿èªæžã¿ã®ããŒãžããã¹ãããããã«è¿œå ã®ãªã¯ãšã¹ãã«è¿œå ãããŸãã
èªèšŒã¯ããªãé·ãããã»ã¹ã§ããããããŠãŒã¶ãŒããšã«èªèšŒCookieãäžåºŠã ãååŸããã©ããã«ä¿åããããšãææ¡ããŸãã ããšãã°ããã®ãããªCookieã¯é åã«æ ŒçŽãããŠããŸãã ããŒã¯ãŠãŒã¶ãŒã®ãã°ã€ã³ã§ãããå€ã¯ãããã«é¢ããæ å ±ã§ãã 次ã®ãŠãŒã¶ãŒã®ããŒããŸã ãªãå Žåã¯ãæ¿èªããŸãã ããããã°ãç§ãã¡ã¯ããã«èå³ã®ãããªã¯ãšã¹ããããŸãã
æ¿èªãããããŒãžããã§ãã¯ãããã¹ãã³ãŒãã®äŸã¯æ¬¡ã®ããã«ãªããŸãã
public function testAuthPage() { $url = 'bryak.com'; $cookies = $this->getAuthCookies('employee@bryak.com', '12345'); $response = $this->getCurlResponse($url, ['cookies' => $cookies]); $this->assertHTMLPresent('<body>', $response, 'Error: test cannot find body element on the page.'); }
ã芧ã®ãšãããèªèšŒCookieãåä¿¡ãããããããã«ãªã¯ãšã¹ãã«è¿œå ããã¡ãœãããè¿œå ãããŸããã ã¡ãœããèªäœã¯éåžžã«ç°¡åã«å®è£ ãããŸãã
public function getAuthCookies($email, $password) { // check if cookie already has been got If (array_key_exist($email, self::$known_cookies)) { return self::$known_cookies[$email]; } $url = self::DOMAIN_STAGING . '/auth_page_adds'; $post_data = ['email' => $email, 'password' => $password]; $response = $this->getCurlResponse($url, ['post_data' => $post_data]); $cookies = $this->parseCookiesFromResponse($response); // save cookie for further use self::$known_cookies[$email] = $cookies; return $cookies; }
ã¡ãœããã¯æåã«ããã®é»åã¡ãŒã«ã«å¯ŸããŠä»¥åã«åä¿¡ããèªèšŒCookieããããã©ããã確èªããŸãïŒãã®å Žåããã°ã€ã³ãŸãã¯ãã®ä»ã®å¯èœæ§ããããŸãïŒã ããå Žåã圌ã¯ãããè¿ããŸãã ããã§ãªãå Žåã圌ã¯èš±å¯ããŒãžïŒããšãã°ãbryak.com / auth_page_addsïŒã«å¿ èŠãªãã©ã¡ãŒã¿ãŒïŒé»åã¡ãŒã«ãšãŠãŒã¶ãŒãã¹ã¯ãŒãïŒãèŠæ±ããŸãã ãã®èŠæ±ãžã®å¿çãšããŠããµãŒããŒã¯ããããŒãéä¿¡ããŸããããã®äžã«ã¯èå³ã®ããCookieããããŸãã 次ã®ããã«ãªããŸãã
HTTP/1.1 200 OK Server: nginx Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Set-Cookie: name=value; expires=Wed, 30-Nov-2016 10:06:24 GMT; Max-Age=-86400; path=/; domain=bryak.com
ãããã®åçŽãªæ£èŠè¡šçŸã䜿çšããŠããããã®ããããŒããååCookieãšãã®å€ïŒãã®äŸã§ã¯name = valueïŒãååŸããå¿ èŠããããŸãã çãã解æããã¡ãœããããããŸãã次ã®ããã«ãªããŸãã
$this->assertTrue( (bool)preg_match_all('/Set-Cookie: (([^=]+)=([^;]+);.*)\n/', $response, $mch1), 'Cannot get "cookies" from server response. Response: ' . $response );
Cookieãåä¿¡ããåŸãèš±å¯ãããªã¯ãšã¹ãã«å®å šã«è¿œå ã§ããŸãã
èœäžè©Šéšã®åæ
äžèšããããã®ãããªãã¹ãã¯ãµãŒããŒèŠæ±ã®ã»ããã§ããããšãããããŸãã ãªã¯ãšã¹ããäœæããåçãæäœãã次ã®ãªã¯ãšã¹ããäœæããŸãã é ã®äžã«èããå¿ã³èŸŒãã§ããŸãããã®ãããªãã¹ãã10åç®ã®ãªã¯ãšã¹ãã«è©²åœããå Žåããã®çç±ãç解ããã®ã¯ç°¡åã§ã¯ãªããããããŸããã ããªãã®äººçãç°¡çŽ åããã«ã¯ïŒ
ãŸãããã¹ãã®åŸ®ç²åãæ倧åããããšããå§ãããŸãã 1ã€ã®ãã¹ãã§50ã®ç°ãªãã±ãŒã¹ããã§ãã¯ããªãã§ãã ããã ãã¹ããåçŽã§ããã»ã©ãå°æ¥çã«ã¯ãã¹ãã容æã«ãªããŸãã
ã¢ãŒãã£ãã¡ã¯ããåéããããšã圹ç«ã¡ãŸãã ãã¹ããã¯ã©ãã·ã¥ãããšãæåŸã®ãµãŒããŒã¬ã¹ãã³ã¹ãHTMLãã¡ã€ã«ã«ä¿åããã¢ãŒãã£ãã¡ã¯ãã¹ãã¬ãŒãžã«ã¹ããŒããŸãããã®ãã¡ã€ã«ã¯ããã¹ãã®ååãæå®ããããšã§ãã©ãŠã¶ãŒããéãããšãã§ããŸãã
ããšãã°ãç§ãã¡ã®ãã¹ãã¯ãããŒãžäžã§HTMLã®äžéšãèŠã€ããããšãã§ããªããšããäºå®ã«åºã¥ããŠããŸãã
<span class=âlinkâ>Link<span>
ã³ã¬ã¯ã¿ãŒã«ç§»åããŠã察å¿ããããŒãžãéããŸãã

ãã®ããŒãžã¯ããã©ãŠã¶ã®ä»ã®HTMLããŒãžãšåãæ¹æ³ã§æäœã§ããŸãã CSSãã±ãŒã¿ãŒã䜿çšããŠãæ¬ èœããŠããèŠçŽ ãèŠã€ããå®éã«ååšããªãå Žåã¯ãå€æŽãããã倱ãããããå€æã§ããŸãã ãã°ãèŠã€ãããããããŸããïŒ èŠçŽ ãé©åã«é 眮ãããŠããå Žåãããããã©ããã§ãã¹ããééããå¯èœæ§ããããŸãããã®æ¹åã泚ææ·±ãèŠãªããã°ãªããŸããã
ãã®ã³ã°ã¯ãç掻ãç°¡çŽ åããã®ã«ã圹ç«ã¡ãŸãã ç°¡åã«ç¹°ãè¿ãããšãã§ããããã«ããã©ãŒã«ã³ãã¹ããè¡ââã£ããã¹ãŠã®ãªã¯ãšã¹ããèšé²ããããšããŸãã 第äžã«ãããã«ããããšã©ãŒãåçŸããããã«æã§åæ§ã®äžé£ã®ã¢ã¯ã·ã§ã³ããã°ããè¡ãããšãã§ãã第äºã«ãããããã°é »ç¹ã«èœã¡ããã¹ããèå¥ããããšãã§ããŸãã
解æãšã©ãŒã®æ¯æŽã«å ããŠãäžèšã®ãã°ã¯ããã¹ãããæ¿èªæžã¿ããŒãžãšæªæ¿èªããŒãžã®ãªã¹ãã®äœæã«åœ¹ç«ã¡ãŸãã ãããèŠãã°ãã®ã£ãããç°¡åã«æ¢ããŠåããããšãã§ããŸãã
æåŸã«ãªããŸããããç§ã¯ã¢ããã€ã¹ããããšãã§ããŸã-ãã¹ãã¯å¯èœãªéã䟿å©ã§ãªããã°ãªããŸããã ããããå®è¡ããã®ãç°¡åã§ããã»ã©ãããé »ç¹ã«äœ¿çšãããŸãã ç§ã®å ±åãããç解ããããç°¡æœã«ããã°ããã»ã©ã圌ãã¯ãã泚ææ·±ãç 究ãããŸãã ã¢ãŒããã¯ãã£ãåçŽã§ããã°ããã»ã©ãããå€ãã®ãã¹ããäœæãããæ°ãããã¹ããäœæããæéãçããªããŸãã
ãã¹ãã䜿çšããã®ãäžäŸ¿ã§ãããšæãããå Žå-ã»ãšãã©ã®å Žåãããã¯ããªãã«ã¯èŠããŸããã ããã¯ã§ããã ãæ©ã察åŠããå¿ èŠããããŸãã ããããªããšãããæç¹ã§ãããã®ãã¹ãã«ããŸã泚æãæããªããªãå§ããå±éºæ§ããããããããã§ã«çç£ãšã©ãŒã®ã¹ãããã«ã€ãªããå¯èœæ§ããããŸãã

èšèã§èšãã°ããã®èãã¯æçœã«æããŸããç§ã¯åæããŸãã ããããå®éã«ã¯ãç§ãã¡ã¯çãåªåããããšããããããããŸãã ãã®ãããäœæãåçŽåããã³æé©åãããã°ãªãã§çãç¶ããŸãã :)
ãŸãšã
çŸåšãç§ãã¡ã¯*ãã£ã ã·ããéããŠããŸã*ã¯ãŠããã§ã«605ã®ãã¹ãã ãã¹ãŠã®ãã¹ãã¯ã䞊è¡ããŠå®è¡ãããªãå Žåã4å以å ã«åæ ŒããŸãã
ãã®éã次ã®ããšã確信ããŠããŸãã
- ç§ãã¡ã®ãããžã§ã¯ãã¯ãã¹ãŠã®èšèªã§éãããŠããŸãïŒãã®ãã¡40以äžãå®çšŒåããŠããŸãïŒã
- äž»èŠåœã«ã€ããŠã¯ãé©åãªæ¯ææ¹æ³ã®ã»ãããšãšãã«æ£ããæ¯æ圢æ ã衚瀺ãããŸãã
- åºæ¬çãªAPIãªã¯ãšã¹ãã¯æ£ããæ©èœããŸã
- ãªãã€ã¬ã¯ãã®çéžã¯æ£ããæ©èœããŸãïŒé©åãªãŠãŒã¶ãŒãšãŒãžã§ã³ãã䜿çšããã¢ãã€ã«ãµã€ããå«ãïŒã
- ãã¹ãŠã®å éšãããžã§ã¯ããæ£ãã衚瀺ãããŸãã
ããããã¹ãŠãSelenium WebDriverã§ãã¹ãããã«ã¯ãããã«å€ãã®æéãšãªãœãŒã¹ãå¿ èŠã«ãªããŸãã
ãã¡ãããããã¯Seleniumã«ä»£ãããã®ã§ã¯ãããŸããã æ£ããã¯ã©ã€ã¢ã³ãã®åäœãšã¯ãã¹ãã©ãŠã¶ã®ã±ãŒã¹ã確èªããå¿ èŠããããŸãã ãµãŒããŒã®åäœã確èªãããã¹ãã®ã¿ã眮ãæããããšãã§ããŸãã ããããããã«å ããŠãäºåãã¹ããè¿ éãã€ç°¡åã«å®è¡ã§ããŸãã ã¹ã¢ãŒã¯ãã¹ãã®æ®µéã§ãšã©ãŒãçºçãããããããã¹ã¢ãŒã¯ãçºçããªããå Žåãä¿®æ£åã«ãããŒçŽã®é·ãã»ã¬ã³ãã¹ããå®è¡ããããšã¯å¯èœã§ããïŒ ããã¯ããªãã®è£éã§ãïŒ :)
ãæž èŽããããšãããããŸããã
Vitaliy KotovãQAãªãŒãã¡ãŒã·ã§ã³ãšã³ãžãã¢ã