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.4k
Selenideを使ってみた 〜 ブラウザテスト自動化 〜
Selenideを使ってみた 〜 ブラウザテスト自動化 〜
snowhiro
May 20, 2017
Tweet
Share
Other Decks in Technology
See All in Technology
我々は雰囲気で仕事をしている / How can we do vibe coding as well
naospon
2
210
RAID6 を楔形文字で組んで現代人を怖がらせましょう(実装編)
mimifuwa
0
290
2025新卒研修・Webアプリケーションセキュリティ #弁護士ドットコム
bengo4com
3
10k
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
8.6k
Android Studio の 新しいAI機能を試してみよう / Try out the new AI features in Android Studio
yanzm
0
250
キャリアを支え組織力を高める「多層型ふりかえり」 / 20250821 Kazuki Mori
shift_evolve
PRO
2
280
アジャイルテストで高品質のスプリントレビューを
takesection
0
100
Goでマークダウンの独自記法を実装する
lag129
0
210
マイクロモビリティシェアサービスを支える プラットフォームアーキテクチャ
grimoh
1
180
そのコンポーネント、サーバー?クライアント?App Router開発のモヤモヤを可視化する補助輪
makotot
3
250
メルカリIBIS:AIが拓く次世代インシデント対応
0gm
2
510
Goss: New Production-Ready Go Binding for Faiss #coefl_go_jp
bengo4com
0
1.1k
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
96
6.2k
How STYLIGHT went responsive
nonsquared
100
5.7k
Automating Front-end Workflow
addyosmani
1370
200k
Building an army of robots
kneath
306
45k
Raft: Consensus for Rubyists
vanstee
140
7.1k
YesSQL, Process and Tooling at Scale
rocio
173
14k
A better future with KSS
kneath
239
17k
Done Done
chrislema
185
16k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Art, The Web, and Tiny UX
lynnandtonic
302
21k
Bash Introduction
62gerente
614
210k
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