Slide 1

Slide 1 text

-BSBWFM;FSPͰָͯ͠ ৘ใऩू͢Δʁ גࣜձࣾΏΊΈ౻ݪຑر -BSBWFM+1$POGFSFODF-JHIUOJOH5BML

Slide 2

Slide 2 text

NBLJFT w ๺ւಓࡳຈ͔Β͖·ͨ͠ w 1)1ΧϯϑΝϨϯε๺ւಓ։࠵ʂ w స৬͠·ͨ͠OFX

Slide 3

Slide 3 text

w ࠃ಺τοϓϨϕϧͷΞϓϦઃܭ։ൃɾେن໛αʔϏεӡ༻࣮੷ଟ਺ w ϑϥοτͳ૊৫ϚωʔδϝϯτϨε w ੒௕Ͱ͖Δ؀ڥษڧ͠์୊
 ͋ΒΏΔΠϯϓοτʹରͯ͠ࣄલਃ੥ෆཁˋձࣾิॿ w ೥ऩ͸ࣗݾਃࠂਓࣄධՁ΋ϊϧϚ΋ͳ͍ɾϓϩϏδϣφϧαϥϦʔˢˢˢ w ༗څऔΓ์୊ w ͓໺ࡊࢧڅ ΤϯδχΞʹخ੍͍͠౓͕ͨ͘͞Μ ژ౎ɹ౦ژ ࡳຈ େࡕɹ෱Ԭ

Slide 4

Slide 4 text

w -BSBWFMVOP⒏DJBM w $POTPMFBQQMJDBUJPO w PQUJPOBM &MPRVFOU -PHHJOH 
 BOENBOZPUIFSTʜ

Slide 5

Slide 5 text

w #SPXTFSBVUPNBUJPOBOEUFTUJOH"1* w 4UBOEBMPOF$ISPNFESJWFS w $ISPNFόΠφϦಉࠝ 8JOEPXT.BD-JOVY w ݸผμ΢ϯϩʔυΠϯετʔϧෆཁ

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

ͲΜͳ͜ͱ͕Ͱ͖Δʁ w ࢦఆͨ͠63-Λ։͘ w ϑΥʔϜೖྗϘλϯΛΫϦοΫ w ࢦఆͨ͠TFMFDUPSͷςΩετΛͱͬͯ͘Δ w +BWBTDSJQU΋ಈ͘
 $MJDL.PVTFPWFS%SBH%SPQ+BWBTDSJQU%JBMPH w εΫϦʔϯγϣοτ

Slide 8

Slide 8 text

public function handle() { $this->browse(function($browser) { // login $browser->visit('https://site1.test/login') ->type('email', config('service.site1_email')) ->type('password', config('service.site1_password')) ->press('Login'); // get text $text = $browser->text('#app > main > div > div > div > div > div.card-body'); \Log::info($text); $this->notify(‘Hello Web Artisan’, $text, 'icon.png'); }); }

Slide 9

Slide 9 text

$ php zero site1:login Visit https://site1.test/login: ✔ Type email [email protected]: ✔ Type password secret!: ✔ Press Login: ✔ Text #app > main > div > div > div > div > div.card-body: ✔ [2019-02-16 03:30:24] development.INFO: You are logged in!

Slide 10

Slide 10 text

$this->browse(function($browser) { // login $browser->visit('https://site1.test/login') ->type('email', config('service.site1_email')) ->type('password', config('service.site1_password')) ->press('Login'); // get text $text = $browser->text('#app > main > div > div > div > div > div.card-body'); // slack post $guzzle = new \GuzzleHttp\Client(); $guzzle->post(config('service.slack.webhook_url'), [ 'body' => json_encode([ 'channel' => config('service.slack.channel'), 'text' => $text, 'username' => config('service.slack.username'), 'icon_emoji' => config('service.slack.icon'), ]), ]); });

Slide 11

Slide 11 text

$ php zero site1:slack Visit https://site1.test/login: ✔ Type email [email protected]: ✔ Type password password: ✔ Press Login: ✔ Text #app > main > div > div > div > div > div.card-body: ✔ Screenshot login: ✔

Slide 12

Slide 12 text

$this->task('get site1', function () { $this->browse(function ($browser) { // login $browser->visit('https://site1.test/login') ->type('email', config('service.site1_email')) ->type('password', config('service.site1_password')) ->press('Login'); // get text $this->site1['text'] = $browser->text('#app > main > div > div > div > div > div.card-body'); $browser->screenshot('login'); $this->site1['screenshots'] = storage_path('laravel-console-dusk/screenshots') . '/login.png'; }); });

Slide 13

Slide 13 text

$this->task('upload to s3', function () { // upload to s3 $guzzle = new \GuzzleHttp\Client(); $gyazo = $guzzle->post(config('service.gyazo.url'), [ 'headers' => [ 'content-type' => 'image/png', 'x-api-key' => config('service.gyazo.api_key') ], 'body' => fopen($this->site1['screenshots'], 'r'), ]); if (200 !== $gyazo->getStatusCode()) { throw new \Exception('s3 upload failed.'); } $this->imageUrl = $gyazo->getBody()->getContents(); });

Slide 14

Slide 14 text

$this->task('post slack', function() { // slack message $payload = [ 'channel' => config('service.slack.channel'), 'text' => $this->site1['text'], 'username' => config('service.slack.username'), 'icon_emoji' => config('service.slack.icon'), 'attachments' => [ [ 'image_url' => $this->imageUrl, 'color' => 'good' ] ] ]; $guzzle = new \GuzzleHttp\Client(); $guzzle->post(config('service.slack.webhook_url'), [ 'body' => json_encode($payload), ]); });

Slide 15

Slide 15 text

$ php zero site1:slack-image Visit https://site1.test/login: ✔ Type email [email protected]: ✔ Type password password: ✔ Press Login: ✔ Text #app > main > div > div > div > div > div.card-body: ✔ Screenshot login: ✔ get site1: ✔ upload to s3: ✔ post slack: ✔

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

ͲΜͳ͜ͱ͕Ͱ͖Δʁ w ͔ͳΓ-BSBWFMͱಉ͡Α͏ʹॻ͚Δ w $PNQPTFS࢖͑Δ w FOW&MPRVFOU03.-PH2VFVF-BSBWFM%VTL w σεΫτοϓ௨஌

Slide 18

Slide 18 text

ΞΠσΟΞ w ۈଵ؅ཧγεςϜ ύϒϦοΫͳ"1*ͳͲͳ͍ʜ w ฏ೔༦ํʹಈ͘ w ϑΥʔϜϩάΠϯ w λΠϜΧʔυը໘Λ։͘ w ࠓ೔ͷग़ۈ࣌ࠁΛऔಘ w ࠓ݄ͷ࿑ಇ࣌ؒɺ೔ฏۉΛܭࢉ w σεΫτοϓTMBDL௨஌

Slide 19

Slide 19 text

ΞΠσΟΞ w ۀ຿ใࠂγεςϜ ύϒϦοΫͳ"1*ͳͲͳ͍ʜ w ೔ճ ேPS༦ํ w ϑΥʔϜϩάΠϯ w ը໘ʹදࣔ͞ΕΔܯࠂΛऔಘঝೝґཔະ֬ఆ w σεΫτοϓTMBDL௨஌

Slide 20

Slide 20 text

ΞΠσΟΞ w ӡ༻தαʔϏεͷ؅ཧը໘ ύϒϦοΫͳ"1*ͳͲͳ͍ʜ w ࣌ؒʹճ w ࢦఆͨ͠Օॴʹදࣔ͞ΕΔ਺஋Λऔಘ w εΫϦʔϯγϣοτΛऔΔ w TMBDLʹը૾Ξοϓϩʔυ

Slide 21

Slide 21 text

ͪΐͬͱͨ͠࡞ۀͷ
 ࣗಈԽʹ࢖͑ͦ͏ʂʂ

Slide 22

Slide 22 text

͓͞Β͍ w $POTPMF)FBEMFTT$ISPNF w ΄΅-BSBWFM w $PNQPTFSͰϥΠϒϥϦ௥ՃͳͲࣗ༝ w ։ൃϚγϯ։ൃαʔόʔͷย۱ʹ