■目次
Selenium(PHP版)Selenium(Java版)Selenium(Ruby版)Selenium(Python版)
■Selenium(PHP版)
PHPでブラウザ自動化 - Qiita https://qiita.com/tsuuuuu_san/items/61379b797878d0e0f4d7 PHPUnit + php-webdriver でWebUIのテストを書く - Qiita https://qiita.com/zaburo/items/f11357170953a3c34b8f PHPUnit_Extensions_Selenium2TestCase での各種HTML操作 - Qiita https://qiita.com/84q/items/a0459c03d12315dfd1e8 以下を作業フォルダとする C:\localhost\home\selenium\public_html ▼不要な手順みたい▼ ※「PHP用Webドライバ」が「Chromeドライバ」を使って「Chromeブラウザ」を操作するらしい ■node.jsのインストール(Electronを使う際にインストールしたもの) https://nodejs.org/en/ https://nodejs.org/en/download/releases/ の Node.js v6.5.0 から node-v6.5.0-x64.msi をダウンロード&インストール コマンドプロンプトで、以下のようにバージョンが表示されれば成功 >node -v v6.5.0 >npm -v 3.10.3 ■npmでselenium-standaloneをインストール&起動 npm install -g selenium-standalone@latest selenium-standalone install selenium-standalone start ▲不要な手順みたい▲ ■XAMPPを入手 XAMPP Installers and Downloads for Apache Friends https://www.apachefriends.org/jp/index.html XAMPPを入手し、インストールしておく すでにインストールしている場合は不要 (Windows内のブラウザを操作するために使うので、Vagrant環境があっても別途Windows上にPHPが必要) ■PHP用Webドライバを入手 composer require phpunit/phpunit composer require facebook/webdriver ■Chromeドライバを入手 Downloads - ChromeDriver - WebDriver for Chrome https://sites.google.com/a/chromium.org/chromedriver/downloads 使っているChromeのバージョンに合わせたドライバを入手 C:\localhost\home\selenium\public_html\bin\chromedriver.exe ■プログラムを作成(Yahoo検索を自動化) C:\localhost\home\selenium\public_html\test.php
<?php require_once 'vendor/autoload.php'; use Facebook\WebDriver\Chrome\ChromeDriver; use Facebook\WebDriver\WebDriverBy; use Facebook\WebDriver\WebDriverExpectedCondition; // Chromeドライバを環境変数設定 putenv('webdriver.chrome.driver=bin/chromedriver.exe'); // ブラウザ起動 $driver = ChromeDriver::start(); // 遷移 $driver->get('https://www.yahoo.co.jp/'); // テキストボックス入力 $driver->findElement(WebDriverBy::name('p'))->sendKeys('自動テスト'); // ボタン押下 $driver->findElement(WebDriverBy::id('srchbtn'))->click(); // タイトルが「検索結果」を含むものになるまで待つ $driver->wait()->until( WebDriverExpectedCondition::titleContains('検索結果') ); // テキストを取得 $text = $driver->findElement(WebDriverBy::name('p'))->getAttribute('value'); $text = mb_convert_encoding($text, 'SJIS', 'UTF-8'); // 結果を出力 echo 'TEXT:' . $text . "\n"; // ブラウザを閉じる $driver->close();
■プログラムを実行 php test.php 「php」でPHPが起動しない場合、Windowsの環境変数の「Path」に以下を追加しておく C:\xampp\php もしくは以下のように、パス込みで実行する C:\xampp\php\php.exe test.php
■Selenium(Java版)
■Eclipseインストール Pleiades - 日本語化プラグイン Eclipse, IntelliJ, PhpStorm... http://mergedoc.osdn.jp/ 「Eclipse 4.7 Oxygen」 のボタンから 「Windows 64bit」「Full Edition」「Java」 のEclipseをダウンロード 「pleiades-4.7.1-java-win-64bit-jre_20171019.zip」 を保存 解凍して以下に移動 C:\Pleiades-4.7.1 初回は以下を起動 C:\Pleiades-4.7.1\eclipse\eclipse.exe -clean.cmd ワークスペースに「C:\Users\Yamano\Selenium」を設定して起動(ソースコードを置く任意の場所) 次回は以下を起動。このファイルのショートカットを、デスクトップに作っておくといい C:\Pleiades-4.7.1\eclipse\eclipse.exe 以降は主に、以下のページを参照 [初心者向け] JavaでSeleniumを動かす - Qiita https://qiita.com/tsukakei/items/41bc7f3827407f8f37e8 ■Selenium入手 Downloads http://www.seleniumhq.org/download/ 本来は「Java 3.7.1」をダウンロードすればいいはずだが、今回は以前使った以下を使用する selenium-java-3.0.1 ■ChromeDriver入手 Downloads - ChromeDriver - WebDriver for Chrome https://sites.google.com/a/chromium.org/chromedriver/downloads 以前使ったドライバをインストール…と思ったが、使っているChromeが62なので、それにあったドライバを入手 ■Eclipse設定 メニューから「ファイル → 新規 → Javaプロジェクト」を実行 プロジェクト名に「selenium-sample」を入力して「完了」ボタンを押す プロジェクト内に「exe」フォルダを作成し、入手した chromedriver.exe を配置 プロジェクト内に「lib」フォルダを作成し、入手した client-combined-3.0.1-nodeps.jar を配置。selenium-java-3.0.1\lib の内容も同階層にすべて配置 プロジェクトを右クリック「ビルドパス → 外部アーカイブの追加」を選択し、 selenium-sample\lib 内のファイルをすべて追加 ■テスト実行 「src」フォルダを右クリックし、「新規 → クラス」を選択 パッケージに「jp.co.example.test」を入力し、名前に「SampleTest」を入力して完了を押す パッケージ名以外を以下に変更
import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class SampleTest { @Test public void testGoogleSearch() throws InterruptedException { // Optional, if not specified, WebDriver will search your path for chromedriver. System.setProperty("webdriver.chrome.driver", "C:/Users/Yamano/Selenium/selenium-sample/exe/chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.get("http://www.google.com/xhtml"); Thread.sleep(5000); // Let the user actually see something! WebElement searchBox = driver.findElement(By.name("q")); searchBox.sendKeys("ChromeDriver"); searchBox.submit(); Thread.sleep(5000); // Let the user actually see something! driver.quit(); } }
SampleTest.java を右クリックし、「実行 → JUnitテスト」で実行できる Chromeが立ち上がり、Googleにアクセスして検索結果が表示されれば成功
■Selenium(Ruby版)
WebのUIテスト自動化 - Seleniumを使ってみる http://qiita.com/edo_m18/items/ba7d8a95818e9c0552d9 Selenium WebDriver + Ruby でWeb関係の自動化 http://ntkg.hatenablog.com/entry/2016/06/08/225241 Webブラウザの自動操作 (Selenium with Rubyの実例集) https://www.qoosky.io/techs/71dd2d67ea 全国のSeleniumer必読 http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856 RubyでSeleniumを使ってスクレイピング http://qiita.com/tomerun/items/9cb81d7a98150ff22f53 Selenium WebDriver + Ruby でWeb関係の自動化 http://ntkg.hatenablog.com/entry/2016/06/08/225241 まずはインストール C:\Users\Yamano>gem install selenium-webdriver ERROR: Could not find a valid gem 'selenium-webdriver' (>= 0), here is why: Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/latest_specs.4.8.gz) gem source --add https://rubygems.org/ gem source --remove http://rubygems.org/ gem source https://rubygems.org/ gem install "selenium-webdriver" ↑すべてダメだった selenium-webdriverをインストールできない C:\Users\Yamano>gem install "selenium-webdriver" --source http://rubygems.org" Fetching: rubyzip-1.2.0.gem (100%) Successfully installed rubyzip-1.2.0 Fetching: ffi-1.9.14-x64-mingw32.gem (100%) Successfully installed ffi-1.9.14-x64-mingw32 Fetching: childprocess-0.5.9.gem (100%) Successfully installed childprocess-0.5.9 Fetching: websocket-1.2.3.gem (100%) Successfully installed websocket-1.2.3 Fetching: selenium-webdriver-3.0.3.gem (100%) Successfully installed selenium-webdriver-3.0.3 Parsing documentation for childprocess-0.5.9 Installing ri documentation for childprocess-0.5.9 Parsing documentation for ffi-1.9.14-x64-mingw32 Installing ri documentation for ffi-1.9.14-x64-mingw32 Parsing documentation for rubyzip-1.2.0 Installing ri documentation for rubyzip-1.2.0 Parsing documentation for selenium-webdriver-3.0.3 Installing ri documentation for selenium-webdriver-3.0.3 Parsing documentation for websocket-1.2.3 Installing ri documentation for websocket-1.2.3 Done installing documentation for childprocess, ffi, rubyzip, selenium-webdriver, websocket after 7 seconds WARNING: Unable to pull data from 'https://rubygems.org/': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/latest_specs.4.8.gz) 5 gems installed ↑「--source http://rubygems.org"」を指定するとインストールできた C:\localhost\home\ruby\public_html\selenium>irb irb(main):001:0> require "selenium-webdriver" => true irb(main):002:0> driver = Selenium::WebDriver.for :firefox Selenium::WebDriver::Error::WebDriverError: Unable to find Mozilla geckodriver. Please download the server from https://github.com/mozilla/geckodriver/releases and place it somewhere on your PATH. More info at https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver. ↑一つずつコマンドを指定してみると、ドライバが必要だと言われた https://github.com/mozilla/geckodriver/releases から geckodriver-v0.11.1-win64.zip をダウンロード 解凍して作成された geckodriver.exe を C:\selenium に配置し、PATH を登録
require "selenium-webdriver" # Firefox用のドライバを使う driver = Selenium::WebDriver.for :firefox # Googleにアクセス driver.navigate.to "http://google.com" # `q`というnameを持つ要素を取得 element = driver.find_element(:name, 'q') # `Hello WebDriver!`という文字を、上記で取得したinput要素に入力 element.send_keys "Hello WebDriver!" # submitを実行する(つまり検索する) element.submit # 表示されたページのタイトルをコンソールに出力 puts driver.title # 3秒待つ(サンプル) sleep 3 # テストを終了する(ブラウザを終了させる) driver.quit
コマンドラインから実行すると、Firefoxが立ち上がった C:\localhost\home\ruby\public_html\selenium>ruby selenium.rb Google テストサイトを開き、管理者ページにログインし、スクリーンショットを撮影するサンプル
require "selenium-webdriver" # Firefox用のドライバを使う driver = Selenium::WebDriver.for :firefox # テストサイトにアクセス driver.navigate.to "http://localhost/~test/levis-members/" # 「管理者用」リンクをクリック driver.find_element(:xpath, '//ul[1]/li[3]/a[1]').click # 1秒待つ sleep 1 # ログインフォームに、ユーザ名とパスワードを入力 element = driver.find_element(:name, 'username') element.send_keys "admin" element = driver.find_element(:name, 'password') element.send_keys "1234" # ログインする element.submit # 表示されたページのタイトルをコンソールに出力 puts driver.title # スクリーンショットを保存 driver.save_screenshot "ss/admin.png" # 3秒待つ sleep 3 # テストを終了する(ブラウザを終了させる) driver.quit
何故か要素を参照できない…という場合、「sleep 1」のように待ってから参照するといい nokogiriを扱う準備としてXPathを学ぶ http://d.hatena.ne.jp/riocampos+tech/20130824/p1
■Selenium(Python版)
Python で Selenium WebDriver を使ったブラウザテストをする方法 http://akiyoko.hatenablog.jp/entry/2014/04/29/231343 Selenium IDEをインストール Firefoxで https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/ にアクセスしてインストール Selenium IDE を立ち上げた状態でブラウザを操作すると、コマンドが記録されていった そのままエクスポート C:\localhost\home\python\public_html\selenium>python test.py エクスポートされたファイルを実行してもエラーになった。Firefoxのバイナリを見つけられないらしい WebDriverException: Message: Expected browser binary location, but unable to find binary in default location, no 'moz:firefoxOptions.binary' capability provided, and no binary flag set on the command line FirefoxBinary を読み込んで、Firefoxの実行ファイルを直接指定
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary ←追加 def setUp(self): binary = FirefoxBinary(r'C:\Program Files (x86)\Mozilla Firefox\firefox.exe') ←追加 self.driver = webdriver.Firefox(firefox_binary=binary) ←修正
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import Select from selenium.webdriver.firefox.firefox_binary import FirefoxBinary from selenium.common.exceptions import NoSuchElementException from selenium.common.exceptions import NoAlertPresentException import unittest, time, re import os class Test(unittest.TestCase): def setUp(self): binary = FirefoxBinary(r'C:\Program Files (x86)\Mozilla Firefox\firefox.exe') self.driver = webdriver.Firefox(firefox_binary=binary) self.driver.implicitly_wait(30) self.base_url = "http://www.yahoo.co.jp/" self.verificationErrors = [] self.accept_next_alert = True def test_(self): driver = self.driver driver.get(self.base_url) driver.find_element_by_id("srchtxt").clear() driver.find_element_by_id("srchtxt").send_keys(u"テスト") driver.find_element_by_id("srchbtn").click() driver.find_element_by_link_text(u"テスト - Wikipedia").click() driver.find_element_by_link_text(u"ソフトウェアテスト").click() time.sleep(3) FILENAME = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ss\\screen.png") # Get Screen Shot driver.save_screenshot(FILENAME) def is_element_present(self, how, what): try: self.driver.find_element(by=how, value=what) except NoSuchElementException as e: return False return True def is_alert_present(self): try: self.driver.switch_to_alert() except NoAlertPresentException as e: return False return True def close_alert_and_get_its_text(self): try: alert = self.driver.switch_to_alert() alert_text = alert.text if self.accept_next_alert: alert.accept() else: alert.dismiss() return alert_text finally: self.accept_next_alert = True def tearDown(self): self.driver.quit() self.assertEqual([], self.verificationErrors) if __name__ == "__main__": unittest.main()
これで実行するとOKだった…が、最低限のものなら、もっとシンプルに書ける http://qiita.com/setsulla/items/918ea1872c1947bf108f
# -*- coding: utf-8 -*- import os, time from selenium import webdriver from selenium.webdriver.firefox.firefox_binary import FirefoxBinary FILENAME = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ss/screen.png") binary = FirefoxBinary(r'C:\Program Files (x86)\Mozilla Firefox\firefox.exe') driver = webdriver.Firefox(firefox_binary=binary) driver.get("http://www.yahoo.co.jp/") driver.find_element_by_id("srchtxt").clear() driver.find_element_by_id("srchtxt").send_keys(u"テスト") driver.find_element_by_id("srchbtn").click() time.sleep(3) # Get Screen Shot driver.save_screenshot(FILENAME) # Close Web Browser driver.quit()