4言語対応のSeleniumハンズオンを開催しました

こんにちは、大阪開発部の岡田です。

先日告知させていただいた、京都IT系学生コミュニティ CAMPHOR- さんとサイボウズによる合同 Selenium 勉強会を12/14(日)に開催しました。

CAMPHOR-さんの活動拠点CAMPHOR-HOUSEにお邪魔しました。
CAMPHOR-さんの活動拠点CAMPHOR-HOUSEにお邪魔しました。

発表資料

4言語対応ハンズオン

参加者のみなさんの得意な言語で Selenium を体験してもらうために、Ruby, Python, JavaScript (Node.js), Java の4言語それぞれの解説とサンプルプログラムを用意しました。各言語3~5名ずつの利用者がいましたが、みなさん言語の基礎的なところで詰まることはなかったので、がんばって準備した甲斐がありました。

私は日本語しか話せませんが、マルチリンガルになった気分を味わえて良かったです。

懇親会では、社会人も学生もお寿司とピザとビールに夢中。
懇親会では、社会人も学生もお寿司とピザとビールに夢中。

最後にみんなで記念撮影。サイボウズの人気ノベルティ「ボウズマンにぎにぎ」も一緒に。
最後にみんなで記念撮影。サイボウズの人気ノベルティ「ボウズマンにぎにぎ」も一緒に。

サンプルプログラム

インストール後の簡単な動作確認のプログラムも合わせて、計3つのプログラムを書いていただきました。せっかくなのでここで1つご紹介します。

お題

Google検索ページで「サイボウズ」を検索した時に表示される関連キーワード一覧を出力してください。

Python

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions

driver = webdriver.Firefox()
driver.get("http://www.google.com")

# 検索を実行
input = driver.find_element(By.NAME, "q")
input.send_keys(u"サイボウズ")
input.submit()

# 検索結果が表示されるまで待つ
WebDriverWait(driver, 10).until(expected_conditions.title_is(u"サイボウズ - Google 検索"))

# 関連キーワード一覧を出力
extra = driver.find_element(By.ID, "extrares")
links = extra.find_elements(By.TAG_NAME, "a")
for link in links:
    print link.text

driver.quit()

Ruby

require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.get "http://www.google.com"

# 検索を実行
input = driver.find_element(:name, "q")
input.send_keys("サイボウズ")
input.submit()

# 検索結果が表示されるまで待つ
wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until {
    driver.title == "サイボウズ - Google 検索"
}

# 関連キーワード一覧を出力
extra = driver.find_element(:id, "extrares")
links = extra.find_elements(:tag_name, "a")
links.each {|link|
    puts link.text
}

driver.quit

JavaScript (Node.js)

var By = require('selenium-webdriver').By;
var firefox = require('selenium-webdriver/firefox');

var driver = new firefox.Driver();
driver.get('http://www.google.com');

// 検索を実行
var input = driver.findElement(By.name('q'));
input.sendKeys('サイボウズ');
input.submit();

// 検索結果が表示されるまで待つ
driver.wait(function() {
    return driver.getTitle().then(function(title) {
        return title == 'サイボウズ - Google 検索';
    });
}, 10000);

// 関連キーワード一覧を出力
var extra = driver.findElement(By.id('extrares'));
extra.findElements(By.tagName('a')).then(function(links) {
    for (var i = 0; i < links.length; i++) {
        links[i].getText().then(function(text) {
            console.log(text);
        });
    }
});

driver.quit();

Java

import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class SeleniumSample {
    public static void main(String[] args) {
        WebDriver driver = new FirefoxDriver();
        driver.get("http://google.com");

        // 検索を実行
        WebElement input = driver.findElement(By.name("q"));
        input.sendKeys("サイボウズ");
        input.submit();

        // 検索結果が表示されるまで待つ
        (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver d) {
                return d.getTitle().equals("サイボウズ - Google 検索");
            }
        });

        // 関連キーワード一覧を出力
        WebElement extra = driver.findElement(By.id("extrares"));
        List<WebElement> links = extra.findElements(By.tagName("a"));
        for (WebElement link : links) {
            System.out.println(link.getText());
        }

        driver.quit();
    }
}

またやります!

ハンズオン形式の勉強会は今回が初めてだったのですが、みなさん教え合いながら和気あいあいと取り組んでくださって、実際に手を動かす勉強会は楽しいなぁと感じました。

時間の都合で全員が書き終えるのを待つことができなかったのが心残りですが、反省を踏まえて次回はもっと楽しい勉強会を開催できるようにしたいと思います。

日程は未定ですが、近々またやりますのでお楽しみに!