SlideShare a Scribd company logo
1 of 37
Download to read offline
JAVASCRIPT ♥ WEB DRIVER
@kuronekomichael
福岡Haxe勉強会 feat. HTML5+α @福岡 - 第0x00回
introduction
自動テストは誰もがやりたいと思うが、敷居が高い
特にUIテストは技術的にも運用的にも難しい
少しでも作業減らしたいよね
Web Driverは意外と簡単に使えるよ
JavaScriptで書けるのでディベロッパーも頑張れるよ
メンテナブルなテストコードを書こうよ
でもさ
Web Driverとは
Googleが開発したWebアプリテストツール。
2011年にSeleniumと統合された。
Selenium2 === WebDriver
RESTfulなHTTPプロトコル「Json Wire Protocol」で
ブラウザの遠隔操作を実現
今日はRemote Web Driverの話だけやります
JsonWireProtocol: https://code.google.com/p/selenium/wiki/JsonWireProtocol
WebアプリのUIテスト
プラットフォーム毎/ブラウザ毎に、同じことを何度も何度も・・・
drawn by Cacoo: http://cacoo.com/
あ、IE9でも確認しておかないと…
drawn by Cacoo: http://cacoo.com/
Androidが追加!2.xと4.xは別物なの?!
drawn by Cacoo: http://cacoo.com/
GalaxyS4だけおかしい?AQUOS Phoneも?
何?部長がiOS7βにしただとおお?!?
drawn by Cacoo: http://cacoo.com/
GAME OVER
部長マジくたばれ
DEMO
Web Driverの仕組み
・テストコードを元に操作を要求する「WebDriver クライアント」
・HTTP経由で要求を受け取ってブラウザを操作する「WebDriver サーバ」
 ブラウザを操作するための「ドライバ」(ブラウザ毎に用意されている)
drawn by Cacoo: http://cacoo.com/ねこび∼ん by カネウチカズコ: http://ja.netbeans.org/nekobean
Web Driver Server
自前でWeb Driver Serverを準備したくないなら、Sause Labを使う手もあります https://saucelabs.com/php/se2/2
drawn by Cacoo: http://cacoo.com/ねこび∼ん by カネウチカズコ: http://ja.netbeans.org/nekobean
Web Driver Client
Json Wire Protocolに従ったhttpリクエスト/レスポンスが
処理できれば、実装言語は何でもいい
すでに言語毎に様々な実装有り(サードパーティ含む)
ねこび∼ん by カネウチカズコ: http://ja.netbeans.org/nekobean
JavaScriptでのテストコード実装
Nodeで実行
ライブラリは選択肢多数
WebDriverJs(公式)
jwebdriver
webdriver.js
burnout
wd and etc.
今回は wd を使用
wdでの実装例
var wd = require('wd'),
assert = require('assert'),
browser = wd.remote({hostname: '10.0.2.19', port: 8080});
browser.init({browserName:'android'}, function(err, sessionId) {
// ページを開く
browser.get("http://demo.basercms.net/", function(err) {
// 要素を取得
browser.elementByCssSelector('#global_menu .menu04 a', function(err, el) {
// 要素の文字列をチェック
el.text(function(err, text) {
assert.equal(text, '新着情報');
// 終了
browser.quit();
});
});
});
});
wdはサンプルも豊富なので参考に。Json Wire ProtocolとAPIの対比表は、読み方に慣れが必要かも…。
wd document: https://github.com/admc/wd
より実践的に
溢れだす欲求
ページを開く前にセッション情報(Cookie)を入れたい
ページ毎にtitleが正しいかテストしたい
要素が存在するか判定したい
アンカーをクリックしたい
要素をタップしたい
エビデンス(スクリーンショット)を取りたい
非同期に表示される要素が出てから次に進みたい
などなどなどなど
実践例
1)事前にセッション情報(Cookie)を入れる
2)ページを開いて、意図したタイトルかテスト
3)必須要素が存在するかテスト
4)特定の要素をクリックして
意図したページへ遷移するかテスト
5)ページ毎にスクリーンショットを保存
DEMO
1)事前にセッション情報を入れる
// 古いセッション情報を削除
browser.deleteAllCookies(function(err) {
// セッション情報を設定
browser.setCookie({name:'uuid', value:'...'}, function(err) {
// 続きの処理
});
});
※いったん全てのCookieを削除しているのは、Android DriverでBrowserのCookieを引き継いでしまうのを防ぐため
残念!
他にもCookieを入れる必要がありました
1)事前にセッション情報を入れる×3
// 古いセッション情報を削除
browser.deleteAllCookies(function(err) {
// セッション情報を設定
browser.setCookie({name:'uuid', value:'...'}, function(err) {
browser.setCookie({name:'cookie-P', value:'...'}, function(err) {
browser.setCookie({name:'tutorial_flag', value:'true'}, function(err) {
// 続きの処理
});
});
});
});
さあ!胡散臭くなってまりいました!
2) ページを開いてタイトルをテスト
// ページを開く
browser.get("http://ncat.me/", function(err) {
assert.ifError(err);
// タイトルが意図した文字列かテスト
browser.title(function(err, title) {
assert.ifError(err);
assert.ok(~title.indexOf('ネガネガ ネガにゃんこ'));
// 続きの処理
});
});
3) 必須要素が存在するかテスト
// 画面が表示されるまで待つ
browser.waitForVisibleByCssSelector('#mypageBtnPortal', 10 * 1000, function(err) {
// 必須要素が存在するかテスト
browser.elementByCssSelector('#mypageBtnPortal', function(err, element) {
assert.ifError(err);
// 続きの処理
});
});
4) 要素をクリックして遷移をテスト
// 特定の要素をクリック
element.click(function(err) {
assert.ifError(err);
// 遷移先ページが表示されるまで待つ
browser.waitForVisibleByCssSelector('#btnBack', 10 * 1000, function(err) {
assert.ifError(err);
// 続きの処理
});
});
5) スクリーンショットを保存
// スクリーンショットを撮る
browser.takeScreenshot(function(err, screenshot) {
assert.ifError(err);
fs.writeFile('screenshot.png', screenshot, 'base64', function(err) {
assert.ifError(err);
// もし続きがあればここに
});
});
browser.init({browserName: 'android'}, function(err, sessionId) {
assert.ifError(err);
// ページを開く
browser.get("http://ncat.me/dl/", function(err) {
assert.ifError(err);
// 古いセッション情報を削除
browser.deleteAllCookies(function(err) {
assert.ifError(err);
// セッション情報を設定
browser.setCookie({name:'uuid', value:'...'}, function(err) {
assert.ifError(err);
browser.setCookie({name:'cookie-P', value:'...'}, function(err) {
assert.ifError(err);
browser.setCookie({name:'tutorial_flag', value:'true'}, function(err) {
assert.ifError(err);
// Cookie付きで再びページを開く
browser.get("http://ncat.me/", function(err) {
assert.ifError(err);
// タイトルが意図した文字列かテスト
browser.title(function(err, title) {
assert.ifError(err);
assert.ok(~title.indexOf('ネガネガ ネガにゃんこ'));
// 画面が表示されるまで待つ
browser.waitForVisibleByCssSelector('#mypageBtnPortal', 10 * 1000, function(err) {
// 必須要素が存在するかテスト
browser.elementByCssSelector('#mypageBtnPortal', function(err, element) {
assert.ifError(err);
// 特定の要素をクリックして意図したページに遷移するかテスト
element.click(function(err) {
assert.ifError(err);
browser.waitForVisibleByCssSelector('#btnBack', 10 * 1000, function(err) {
assert.ifError(err);
// スクリーンショットを撮る
browser.takeScreenshot(function(err, screenshot) {
assert.ifError(err);
fs.writeFile('screenshot.png', screenshot, 'base64', function(err) {
assert.ifError(err);
browser.quit();
});
});
});
});
});
});
});
});
});
});
});
});
});
});
WELCOME TO
CALLBACK HELL
here come a
Callback Monster
Copyright © 2013 Warner Bros. Pictures / Picture from http://www.zekefilm.org/2013/07/11/tag-team-review-pacific-rim/
コールバック地獄
コールバックの連鎖に陥る危険については、
公式のドキュメントでも言及されている
https://code.google.com/p/selenium/wiki/WebDriverJs#Understanding_the_API
対策
Control Flow?
Promise?
・そもそも関数がまたがるのは直感的じゃない
・時系列に書きたい・読みたい
REDEMPTION FROM
CALLBACK HELL
人類には
yieldがある・・・!
Copyright © 2013 Warner Bros. Pictures / Picture from http://www.prairiedogmag.com/review-pacific-rim-delivers-quality-entertainment-but-little-else/
We don't give up
REDEMPTION FROM
CALLBACK HELL
人類には
yieldがある・・・!
Copyright © 2013 Warner Bros. Pictures / Picture from http://www.prairiedogmag.com/review-pacific-rim-delivers-quality-entertainment-but-little-else/
yield/generator
関数の実行を途中で中断して、
必要に応じて再開する機能
なんだ、夢でも見ているのか・・?
ECMA Script6で導入が決定している
1. 2006/10 FireFox2で独自実装
(ECMA Script3拡張、JavaScipt1.7)
2. ECMAScript6(harmony)に導入決定
次世代JavaScriptに入ることが確定
3. 先行してV8に実装完了
4. Chrome Canary(Chrome開発版)には既に導入済み
Node 0.12以降に導入済み
ECMAScript 6draft: http://wiki.ecmascript.org/doku.php?id=harmony:generators
yieldの簡単な使用例
function* asyncCode() {
console.log('初めの処理');
yield 1;
console.log('何か終わった後の処理');
return 2;
}
// generatorの生成(まだ関数は実行されない)
var gen = asyncCode();
// 1回めの実行
var ret = gen.next();
// コンソールには’初めの処理’が出力される
// ret === {value:1, done:false}
// 2回めの実行
ret = gen.next();
// コンソールには’何か終わった後の処理’が出力される
// ret === {value:2, done:true}
wd-sync
wdを拡張したモジュール
yieldを使ってAPIを全て同期に置換えている
実はECMAScriptのyieldは使ってない(*ノω・*)テヘ
wd-syncは fibers を使って同期を実現している
fibersはJavaScriptだけではなくCのコードで同じ機能を実現させている
他にも無理矢理実現させているモジュールもあるみたい
(関数を文字列化してsetTimeoutで無理矢理分割とか...)
wd-syncを使った実装
sync(function() {
browser.init({browserName: 'android'});
// Cookieを設定するためにいったんサイトを開く
browser.get("http://ncat.me/dl/");
// セッション情報を再設定
browser.deleteAllCookies();
browser.setCookie({name:'uuid', value:'...'});
browser.setCookie({name:'cookie-P', value:'...'});
browser.setCookie({name:'tutorial_flag', value:'true'});
// Cookieを設定したので、改めて開く
browser.get("http://ncat.me/");
// タイトルが意図した文字列かテスト
var title = browser.title();
assert.ok(~title.indexOf('ネガネガ ネガにゃんこ'));
// 画面が表示されるまで待つ
browser.waitForVisibleByCssSelector('#mypageBtnPortal', 10 * 1000);
// 必須要素が存在するかテスト
var element = browser.elementByCssSelector('#mypageBtnPortal');
assert.ok(element);
// 特定の要素をクリックして意図したページに遷移するかテスト
element.click();
browser.waitForVisibleByCssSelector('#btnBack', 10 * 1000);
// スクリーンショットを取得
var screenshot = browser.takeScreenshot();
assert.ok(screenshot);
fs.writeFileSync('screenshot.png', screenshot, 'base64');
});
ending
意外とWeb Driverは簡単
うまく動作しない時は、http req/resの中身を見る
Json Wire Protocolは理解しやすいので一読オススメ
コールバック地獄から抜けだそう
ブラウザのコードではまだ地獄が続くけど…
テストコードはシンプルが第一
やっぱりUIのテストは難しい
完璧は求めずに、やれることからやろう(not TDD)
スモークテストでいいじゃない
御清聴あざした!

More Related Content

What's hot

負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~
負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~
負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~johgus johgus
 
Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!
Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!
Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!Java女子部
 
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発Yoshitaka Kawashima
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaYuta Kawadai
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!Shohei Okada
 
第5回勉強会
第5回勉強会第5回勉強会
第5回勉強会Mugen Fujii
 
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」Hiroaki NAKADA
 
Play!30分クッキング
Play!30分クッキングPlay!30分クッキング
Play!30分クッキングShinichi Kozake
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜JustSystems Corporation
 
はじめてのSpring Boot
はじめてのSpring BootはじめてのSpring Boot
はじめてのSpring Bootなべ
 
Spring bootでweb ユニットテスト編
Spring bootでweb ユニットテスト編Spring bootでweb ユニットテスト編
Spring bootでweb ユニットテスト編なべ
 
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugSpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugToshiaki Maki
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にTaku Miyakawa
 
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々torutk
 
Jenkins javascript ci
Jenkins javascript ciJenkins javascript ci
Jenkins javascript cihisame64
 
JavaOne2013報告会 JavaFX Update
JavaOne2013報告会 JavaFX UpdateJavaOne2013報告会 JavaFX Update
JavaOne2013報告会 JavaFX UpdateTakashi Aoe
 
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかJavaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかYoshitaka Kawashima
 

What's hot (20)

負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~
負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~
負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~
 
Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!
Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!
Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!
 
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
 
第5回勉強会
第5回勉強会第5回勉強会
第5回勉強会
 
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」
 
Introduction to Spock
Introduction to SpockIntroduction to Spock
Introduction to Spock
 
Play!30分クッキング
Play!30分クッキングPlay!30分クッキング
Play!30分クッキング
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
はじめてのSpring Boot
はじめてのSpring BootはじめてのSpring Boot
はじめてのSpring Boot
 
Spring bootでweb ユニットテスト編
Spring bootでweb ユニットテスト編Spring bootでweb ユニットテスト編
Spring bootでweb ユニットテスト編
 
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugSpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
 
Heap statsfx analyzer
Heap statsfx analyzerHeap statsfx analyzer
Heap statsfx analyzer
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心に
 
CLRH_120414_WFTDD
CLRH_120414_WFTDDCLRH_120414_WFTDD
CLRH_120414_WFTDD
 
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
 
Jenkins javascript ci
Jenkins javascript ciJenkins javascript ci
Jenkins javascript ci
 
JavaOne2013報告会 JavaFX Update
JavaOne2013報告会 JavaFX UpdateJavaOne2013報告会 JavaFX Update
JavaOne2013報告会 JavaFX Update
 
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかJavaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
 

Similar to JavaScriptでWebDriverのテストコードを書きましょ

13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxNobuhiro Sue
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Akira Inoue
 
Node.js勉強会 Framework Koa
Node.js勉強会 Framework KoaNode.js勉強会 Framework Koa
Node.js勉強会 Framework Koakamiyam .
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_GebNobuhiro Sue
 
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスドMicrosoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスドKazumi Hirose
 
Web Workers
Web WorkersWeb Workers
Web Workerskaboccha
 
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンChrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンYoichiro Tanaka
 
チュートリアルではじめるVue.js
チュートリアルではじめるVue.jsチュートリアルではじめるVue.js
チュートリアルではじめるVue.js小川 昌吾
 
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみたYuki Takei
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用Yatabe Terumasa
 
jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発Akira Inoue
 
Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Toshiro Shimizu
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01Yusuke Ando
 
LabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training SlideLabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training SlideYusuke Tochigi
 
ルーター自前実装の話
ルーター自前実装の話ルーター自前実装の話
ルーター自前実装の話Kazushi Kawamura
 
アプリコンテスト
アプリコンテストアプリコンテスト
アプリコンテストTomonori Yamada
 

Similar to JavaScriptでWebDriverのテストコードを書きましょ (20)

13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
 
Node.js勉強会 Framework Koa
Node.js勉強会 Framework KoaNode.js勉強会 Framework Koa
Node.js勉強会 Framework Koa
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_Geb
 
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスドMicrosoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
 
Web Workers
Web WorkersWeb Workers
Web Workers
 
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンChrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターン
 
Mvc conf session_5_isami
Mvc conf session_5_isamiMvc conf session_5_isami
Mvc conf session_5_isami
 
チュートリアルではじめるVue.js
チュートリアルではじめるVue.jsチュートリアルではじめるVue.js
チュートリアルではじめるVue.js
 
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
HTML5 on ASP.NET
HTML5 on ASP.NETHTML5 on ASP.NET
HTML5 on ASP.NET
 
Windows Azure PHP Tips
Windows Azure PHP Tips Windows Azure PHP Tips
Windows Azure PHP Tips
 
jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発
 
Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
 
LabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training SlideLabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training Slide
 
ルーター自前実装の話
ルーター自前実装の話ルーター自前実装の話
ルーター自前実装の話
 
アプリコンテスト
アプリコンテストアプリコンテスト
アプリコンテスト
 

Recently uploaded

PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 

Recently uploaded (8)

PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 

JavaScriptでWebDriverのテストコードを書きましょ