Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Selenideを使ってみた 〜 ブラウザテスト自動化 〜
Search
snowhiro
May 20, 2017
Technology
2
7.6k
Selenideを使ってみた 〜 ブラウザテスト自動化 〜
Selenideを使ってみた 〜 ブラウザテスト自動化 〜
snowhiro
May 20, 2017
Tweet
Share
Other Decks in Technology
See All in Technology
GCASアップデート(202601-202603)
techniczna
0
200
JAWSDAYS2026_A-6_現場SEが語る 回せるセキュリティ運用~設計で可視化、AIで加速する「楽に回る」運用設計のコツ~
shoki_hata
0
3k
CyberAgentの生成AI戦略 〜変わるものと変わらないもの〜
katayan
0
260
【Oracle Cloud ウェビナー】【入門編】はじめてのOracle AI Data Platform - AIのためのデータ準備&自社用AIエージェントをワンストップで実現
oracle4engineer
PRO
1
150
VLAモデル構築のための AIロボット向け模倣学習キット
kmatsuiugo
0
240
進化するBits AI SREと私と組織
nulabinc
PRO
1
240
コンテキスト・ハーネスエンジニアリングの現在
hirosatogamo
PRO
3
400
WebアクセシビリティをCI/CDで担保する ― axe DevTools × Playwright C#実践ガイド
tomokusaba
2
100
バクラク最古参プロダクトで重ねた技術投資を振り返る
ypresto
0
170
アーキテクチャモダナイゼーションを実現する組織
satohjohn
1
1k
ソフトバンク流!プラットフォームエンジニアリング実現へのアプローチ
sbtechnight
1
180
品質を経営にどう語るか #jassttokyo / Communicating the Strategic Value of Quality to Executive Leadership
kyonmm
PRO
1
310
Featured
See All Featured
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
150
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
180
Joys of Absence: A Defence of Solitary Play
codingconduct
1
310
Marketing to machines
jonoalderson
1
5k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
680
Docker and Python
trallard
47
3.8k
Raft: Consensus for Rubyists
vanstee
141
7.4k
The Pragmatic Product Professional
lauravandoore
37
7.2k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Exploring anti-patterns in Rails
aemeredith
2
290
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Transcript
4FMFOJEFΛͬͯΈͨ ʙϒϥβςετࣗಈԽʙ ++6($$$4QSJOH DDD@N
ࣗݾհ ໊લɿTOPXIJSP ॴଐɿࡳຈͷͱ͋Δ4*FSۈ ීஈͷۀ༰ ɹ+BWBΛར༻ͨ͠8&#ΞϓϦͷ։ൃ ɹ ҙɿࠓൃද͢Δ༰ݸਓͷҙݟͰ͢ɻ
࣍ w TFMFOJEFΛ͖͔͚ͬͨͬ w ͬͯΈͨײ w ϖʔδΦϒδΣΫτ w ֬ೝํ๏ w
·ͱΊ
TFMFOJEFΛ͍࢝Ί͖͔͚ͨͬ ++6($$$GBMMʹͯ ʰ4FMFOJEFΛࢼߦࡨޡ͠ͳ͕Β࣮ફ͢Δϒϥβࣗ ಈςετʱ Λݟͯศརͦ͏ʂͬͯ͜ͱͰૣͬͯݟ·ͨ͠ɻ ࢀߟࢿྉɿ IUUQCBDLQBQFSHJUIVCJPHIPTUTUSZ TFMFOJEF
αϯϓϧΛ࣮ࢪ @Test public void yahooͷݕࡧ() { Selenide.open("https://www.yahoo.co.jp/"); $("#srchtxt").setValue("selenide"); $("#srchbtn").click(); $(".resultNum").shouldHave(text("1,150,000݅"));
} ᶃରͷ63-Λࢦఆͯ͠ϒϥβΛىಈ ᶄࢦఆϑΟʔϧυΛઃఆ͢Δɻ ᶅཁૉΛΫϦοΫ ᶆϖʔδભҠޙͷཁૉͷதΛνΣοΫ
γϯϓϧͰ͍͍͢
ͨͩ͠
Կߟ͑ͣ ʑͱཁૉΛࢦఆͯ͠ॻ͘ͱ ίϐϖ͕େྔੜ࢈͞ΕΔ
!5FTU QVCMJDWPJEZBIPP@TFMFOJEFΛݕࡧ \ 4FMFOJEFPQFO IUUQTXXXZBIPPDPKQ lTSDIUYU
TFU7BMVF TFMFOJEF TSDICUO DMJDL SFTVMU/VN TIPVME)BWF UFYU ݅ ^ !5FTU QVCMJDWPJEZBIPP@TFMFOJVNΛݕࡧ \ 4FMFOJEFPQFO IUUQTXXXZBIPPDPKQ lTSDIUYU TFU7BMVF TFMFOJVN TSDICUO DMJDL SFTVMU/VN TIPVME)BWF UFYU ݅ ^ ཁૉͷࢦఆมΘΒͳ͍ ೖྗͷΈ͕มΘΔͷΈ
ϝϯςφϯεͷࣄΛߟ͑Δͱ ͜ͷঢ়ଶਏ͍
ͦ͜Ͱ
ϖʔδΦϒδΣΫτύλʔϯ
ϖʔδΦϒδΣΫτύλʔϯ ͱʁ
ը໘ʹؔ͢ΔใӅ͠·͠ΐ͏ ͬͯײ͡Ͱ͔͢Ͷɻ
IUUQTHJUIVCDPN4FMFOJVN)2TFMFOJVNXJLJ 1BHF0CKFDUT ৄ͘͠Γ͍ͨํݪจΛͲ͏ͧ
public class SrchPage { @FindBy(id = “srchtxt") private SelenideElement srchTxt;
public void setSrchTxt(String text) { this.srchTxt.setValue(text); } @FindBy(id = "srchbtn") public SelenideElement srchBtn; public ResultPage clickSrchBtn() { ɹ srchBtn.click(); return page(ResultPage.class); } } ϖʔδΦϒδΣΫτΛར༻ͨ͠߹ ϖʔδΦϒδΣΫτͷ࡞ ݅ೖྗଆʣ ᶃ!'JOE#ZʹͯରͷཁૉΛϑΟʔϧυʹ ࢦఆ͢Δɻ ᶄͷऔಘɾઃఆΞΫηοαʔΛܦ༝͠ɺ 4FMFOJEF&MFNFOUͷཁૉӅṭ͢Δɻ ᶅ࣍ͷϖʔδભҠ͢Δ߹ʹ࣍ͷϖʔδ ΦϒδΣΫτͷΠϯελϯεΛฦ٫͢Δ
public class ResultPage { @FindBy(className ="resultNum") private SelenideElement resultNum; public
String getResultNum() { return resultNum.should(exist).getText(); } } ᶃͷऔಘΞΫηοαʔΛܦ༝͠ɺ 4FMFOJEF&MFNFOUͷཁૉӅṭ͢Δɻ ϖʔδΦϒδΣΫτΛར༻ͨ͠߹ ϖʔδΦϒδΣΫτͷ࡞ ݁Ռը໘ଆʣ
@Test public void yahooͷݕࡧ_ϖʔδΦϒδΣΫτ() { SrchPage srchPage = Selenide.open(“https://www.yahoo.co.jp/“ ,
SrchPage.class); srchPage.setSrchTxt("selenide"); ResultPage resultPage = srchPage.clickSrchBtn(); assertThat(resultPage.getResultNum()) .isEqualTo("1,150,000݅"); } ϖʔδΦϒδΣΫτΛར༻ͨ͠߹ ςετέʔεΛهड़ PQFOҎ֎ͷTFMFOJEFͷϝιουΛӅṭ͍ͯ͠·͢ɻ ೖྗϑΟʔϧυʹมߋ͕ೖͬͯมߋରϖʔδ ΦϒδΣΫτͷΫϥεͷΈͰςετέʔεʹӨڹ͕ ग़ͳ͍Α͏ʹͳΓ·͢ɻ
ϖʔδΦϒδΣΫτΛར༻͢Δͱ มߋʹڧ͍ Ͱ ϖʔδΦϒδΣΫτ࡞͢Δͷ ΊΜͲ͍͘͞
ָʹ࡞Ͱ͖ͳ͍͔ ߟ͑ͯΈͨ
αʔόଆͷGPSNΫϥε͔Βͷੜ ɹαʔόଆʹͯ࡞͢Δ'PSNΫϥεΛݩʹ࡞ ͢Δ͜ͱ͕Ͱ͖ͳ͍͔Λݕ౼ͯ͠Έͨɻ Ϙλϯͷใ͕औಘͰ͖ͳ͍ͨΊஅ೦
ϖʔδΞΫηεͯ͠ཁૉऔಘ FMFDUSPOͷXFCWJFXΛར༻ͯ͠ ϖʔδཁૉΛΞΫηεͯ͠औಘ ཉ͍͠ใ͕औಘͰ͖Δ ࠾༻
֓ཁ w FMFDUSPOͷXFCWJFXΛར༻͢Δɻ w ϖʔδͷFMFNFOUΛऔಘͯ͠ϖʔδΦϒ δΣΫτͷϑΟʔϧυͱͯ͠ग़ྗ ɾཁૉͷ໊લJEPSOBNFΛར༻͢Δɻ ɹ
ϔομʔ෦ʹ͋ΔΑ͏ͳ ϝχϡʔͳͲͷڞ௨తͳཁૉʹ͍ͭͯ ͲͷΑ͏ʹ࣮͢Δ͔ Ϋϥεʹ࣮ͯ͠ܧঝͯ͠ར༻͢Δʁ ը໘୯ҐͰͷࡉ͔͍࣮͕Ͱ͖ͳ͍ɻ ϖʔδΦϒδΣΫτϝϞɹͦͷ̍
ϖʔδΦϒδΣΫτϝϞɹͦͷ̍ +BWBͳΒ ʮEFGBVMUNFIUPEʯΛར༻ͯ͠ ΠϯλʔϑΣʔεΛJNQMFNFOUT ͢Δ͜ͱͰඞཁ࠷ݶʹରԠ͢Δ͜ͱ ͕Ͱ͖·͢ɻ
public interface Menu { default void logout() { Selenide.$("#logout-link").click(); }
} public class MainPage implements Menu { @Test public void ϝΠϯॲཧ() { // ϩάΞτ logout(); } } ͪΐͬͱϝϞɹͦͷ̍ σϑΥϧτϝιου ػೳΛར༻
Ҏ্ͰϖʔδΦϒδΣΫτ ʹ͍͓ͭͯ͠·͍ɻ
࣍֬ೝ࡞ۀ
TFMFOJEF TIPVMEͱ$POEJUJPOͷϝιουΛ Έ߹ΘͤΔ͜ͱͰ֬ೝ͕༰қߦ͑·͢ɻ
6*ࢼݧͷత ໌֬Ͱ͔͢ʁ
6*ςετ w ը໘ΩϟϓνϟΛ֬ೝ w ը໘߲ͷΛ֬ೝ w ը໘ભҠͷಈ࡞Λ֬ೝ ʜʑ ৭ʑͳ֬ೝํ๏͕͋Δɻ
৭ʑͳ؍Ͱ֬ೝͰ͖Δͷ͕ཧ
ݱ࣮ʜ શͯΛཏ͢Δͷ͍͠
ը໘ભҠ͕Ͱ͖Ε ޙ͔Βॏཁͳը໘ػೳ͚ͩ ϐοΫΞοϓ͢Ε͍͍ ͱ͍͏ํ͠·ͨ͠
ͱ͍͏͜ͱͰ ը໘ભҠΛத৺ʹ֬ೝΛ࣮ࢪ
w ॳظදࣔͷ߹ w λΠτϧΛ֬ೝ w ը໘ΩϟϓνϟΛऔಘ w ը໘Ͱͷཁૉมߋͷ߹ w ΩʔͱͳΔཁૉ͚ͩ֬ೝ
w ը໘ΩϟϓνϟΛऔಘ ֬ೝ؍
ը૾ΩϟϓνϟׂΓͬͯ ࢹ֬ೝ
ͦͷΘΓ ՃใΛςΩετʹͯग़ྗ ग़ྗ͞ΕͨςΩετͱը໘ΩϟϓνϟΛ ΤϏσϯεܗࣜՃͯ͠ ݟ͘͢͠·ͨ͠
ը໘ΩϟϓνϟϝϞ TFMFOJEFͰ ʮ4FMFOJEFTDSFFOTIPUʯ ͰεΫϦϯγϣοτΛऔಘͰ͖·͢ɻ Ͱ͕͢ ϒϥβʹΑͬͯը໘ औಘൣғ͕ҟͳΓ·͢ TFMFOJVNͷ
w B4IPU IUUQTHJUIVCDPNZBOEFYRBUPPMTBTIPU w 1JUBMJVN IUUQTHJUIVCDPNIJpWFIJpWFQJUBMJVN ରԠ͢ΔͨΊͷϥΠϒϥϦ͕͍͔ͭ͘ Ͱ͍ͯ·͢ͷͰར༻Λݕ౼ͯ͠ΈΔͱ͍ ͍͔͠Ε·ͤΜɻ
ը໘ΩϟϓνϟϝϞ
·ͬͨ͜ͱ
ࡢ·Ͱಈ͍͍ͯͨςετ͕ ىಈ͠ͳ͘ͳͬͨ DISPNF͕ߋ৽͞Ε͍ͯͯ XFCEJSWFSͱόʔδϣϯ͕ Ұக͠ͳ͘ͳ͍ͬͯͨɻ
·ͱΊ
ϖʔδΦϒδΣΫτ ࠷ॳେมͰ ؤுͬͯ࡞Δͱྑ͍͔ͳͱ ࢥ͍·͢ɻ
֬ೝʹ͍ͭͯతΛ໌֬ ͔ͯ͠ΒܭըΛͨ͠ํ͕ྑ͍ ͔ͳͱࢥ͍·͢ɻ
গͮͭ͠ಋೖ͢Δ͜ͱ͕Ͱ͖ΔͷͰ ҰาҰาਐΊΔͷ͕ྑ͍͔ͱࢥ͍·͢ɻ
Ҏ্Ͱ͢ɻ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ N @@ N