Selenium RC (Selenium 1)
はじめに
Selenium RC は、WebDriver/Selenium の統合によって Selenium 2 というより強力なツールが登場するまで、長らく Selenium プロジェクトの主力でした。Selenium 1 はもはやサポートされていないことを強調しておく価値があります。
Selenium RC の仕組み
まず、Selenium RC のコンポーネントがどのように動作し、それぞれのコンポーネントがテストスクリプトの実行においてどのような役割を果たすかについて説明します。
RC コンポーネント
Selenium RC のコンポーネントは次のとおりです。
- ブラウザを起動および終了し、テストプログラムから渡された Selenese コマンドを解釈および実行し、ブラウザと AUT 間で渡される HTTP メッセージを傍受および検証するHTTP プロキシとして機能する Selenium Server。
- 各プログラミング言語と Selenium RC Server 間のインターフェースを提供するクライアントライブラリ。
以下は簡略化されたアーキテクチャ図です。
この図は、クライアントライブラリが Server と通信して、実行する Selenium コマンドを渡していることを示しています。次に、サーバーは Selenium-Core JavaScript コマンドを使用して Selenium コマンドをブラウザに渡します。ブラウザは、JavaScript インタープリタを使用して Selenium コマンドを実行します。これにより、テストスクリプトで指定した Selenese アクションまたは検証が実行されます。
Selenium Server
Selenium Server は、テストプログラムから Selenium コマンドを受信し、それらを解釈し、それらのテストの実行結果をプログラムにレポートします。
RC サーバーは Selenium Core をバンドルし、自動的にブラウザに注入します。これは、テストプログラムが(クライアントライブラリ API 関数を使用して)ブラウザを開いたときに発生します。Selenium-Core は JavaScript プログラムであり、実際にはブラウザの組み込み JavaScript インタープリタを使用して Selenese コマンドを解釈および実行する JavaScript 関数のセットです。
サーバーは、シンプルな HTTP GET/POST リクエストを使用して、テストプログラムから Selenese コマンドを受信します。つまり、HTTP リクエストを送信できる任意のプログラミング言語を使用して、ブラウザで Selenium テストを自動化できます。
クライアントライブラリ
クライアントライブラリは、独自の設計のプログラムから Selenium コマンドを実行できるようにするプログラミングサポートを提供します。サポートされている言語ごとに異なるクライアントライブラリがあります。Selenium クライアントライブラリは、プログラミングインターフェース(API)、つまり、独自のプログラムから Selenium コマンドを実行する関数のセットを提供します。各インターフェース内には、各 Selenese コマンドをサポートするプログラミング関数があります。
クライアントライブラリは、Selenese コマンドを取得し、テスト対象のアプリケーション(AUT)に対して特定のアクションまたはテストを実行するために Selenium Server に渡します。クライアントライブラリは、そのコマンドの結果も受信し、プログラムに返します。プログラムは結果を受信し、プログラム変数に格納して、成功または失敗としてレポートしたり、予期しないエラーが発生した場合は是正措置を講じたりできます。
したがって、テストプログラムを作成するには、クライアントライブラリ API を使用して Selenium コマンドのセットを実行するプログラムを記述するだけです。また、オプションで、Selenium-IDE で作成された Selenese テストスクリプトが既にある場合は、Selenium RC コードを生成できます。Selenium-IDE は、([エクスポート] メニュー項目を使用して)Selenium コマンドをクライアントドライバの API 関数呼び出しに変換できます。Selenium-IDE から RC コードをエクスポートする方法の詳細については、Selenium-IDE の章を参照してください。
インストール
インストールは、Selenium にはやや不適切な名前です。Selenium には、選択したプログラミング言語で使用できるライブラリのセットがあります。ダウンロードページからダウンロードできます。
作業する言語を選択したら、次の手順に従うだけです。
- Selenium RC Server をインストールします。
- 言語固有のクライアントドライバを使用してプログラミングプロジェクトをセットアップします。
Selenium Server のインストール
Selenium RC サーバーは、Java jar ファイル(selenium-server-standalone-
Selenium Server の実行
テストを開始する前に、サーバーを起動する必要があります。Selenium RC サーバーが配置されているディレクトリに移動し、コマンドラインコンソールから以下を実行します。
java -jar selenium-server-standalone-<version-number>.jar
上記のコマンドを含むバッチまたはシェル実行可能ファイル(Windows の場合は .bat、Linux の場合は .sh)を作成することで、これを簡略化できます。次に、デスクトップ上のその実行可能ファイルへのショートカットを作成し、アイコンをダブルクリックするだけでサーバーを起動できます。
サーバーを実行するには、Java がインストールされており、コンソールから実行できるように PATH 環境変数が正しく構成されている必要があります。コンソールで以下を実行して、Java が正しくインストールされていることを確認できます。
java -version
バージョン番号(1.5 以降である必要があります)が表示されたら、Selenium RC を使用する準備ができています。
Java クライアントドライバの使用
- Selenium java クライアントドライバ zip を SeleniumHQ ダウンロードページからダウンロードします。
- selenium-java- を解凍します
.jar ファイル - 目的の Java IDE(Eclipse、NetBeans、IntelliJ、Netweaver など)を開きます。
- Java プロジェクトを作成します。
- selenium-java- を追加します
.jar ファイルをプロジェクトに参照として追加します。 - ファイル selenium-java- をプロジェクトのクラスパスに追加します
.jar。 - Selenium-IDE から、スクリプトを Java ファイルにエクスポートし、Java プロジェクトに含めるか、selenium-java-client API を使用して Java で Selenium テストを記述します。API については、この章で後述します。JUnit または TestNg を使用してテストを実行するか、独自のシンプルな main() プログラムを記述できます。これらの概念については、このセクションで後述します。
- コンソールから Selenium サーバーを実行します。
- Java IDE またはコマンドラインからテストを実行します。
Java テストプロジェクトの構成の詳細については、付録の「Eclipse での Selenium RC の構成」および「Intellij での Selenium RC の構成」セクションを参照してください。
Python クライアントドライバの使用
- PIP 経由で Selenium をインストールします。手順は SeleniumHQ ダウンロードページにリンクされています。
- Python で Selenium テストを記述するか、Selenium-IDE からスクリプトを Python ファイルにエクスポートします。
- コンソールから Selenium サーバーを実行します。
- コンソールまたは Python IDE からテストを実行します。
Python クライアントドライバ構成の詳細については、付録「Python クライアントドライバ構成」を参照してください。
.NET クライアントドライバの使用
- Selenium RC を SeleniumHQ ダウンロードページからダウンロードします。
- フォルダを解凍します
- NUnit をダウンロードしてインストールします(注:NUnit をテストエンジンとして使用できます。NUnit にまだ慣れていない場合は、テストを実行するためのシンプルな main() 関数を記述することもできますが、NUnit はテストエンジンとして非常に役立ちます)。
- 目的の .Net IDE(Visual Studio、SharpDevelop、MonoDevelop)を開きます。
- クラスライブラリ(.dll)を作成します。
- 次の DLL への参照を追加します:nmock.dll、nunit.core.dll、nunit. framework.dll、ThoughtWorks.Selenium.Core.dll、ThoughtWorks.Selenium.IntegrationTests.dll、および ThoughtWorks.Selenium.UnitTests.dll
- .Net 言語(C#、VB.Net)で Selenium テストを記述するか、Selenium-IDE からスクリプトを C# ファイルにエクスポートし、このコードを先ほど作成したクラスファイルにコピーします。
- 独自のシンプルな main() プログラムを記述するか、NUnit をプロジェクトに含めてテストを実行できます。これらの概念については、この章で後述します。
- コンソールから Selenium サーバーを実行します。
- IDE、NUnit GUI、またはコマンドラインからテストを実行します。
Visual Studio での .NET クライアントドライバ構成の詳細については、付録「.NET クライアントドライバ構成」を参照してください。
Ruby クライアントドライバの使用
- RubyGems をまだお持ちでない場合は、RubyForge からインストールします。
gem install selenium-client
を実行します- テストスクリプトの先頭に、
require "selenium/client"
を追加します。 - 任意の Ruby テストハーネス(例:Test::Unit、Mini::Test、または RSpec)を使用してテストスクリプトを記述します。
- コンソールから Selenium RC サーバーを実行します。
- 他の Ruby スクリプトを実行するのと同じ方法でテストを実行します。
Ruby クライアントドライバ構成の詳細については、Selenium-Client documentation
_ を参照してください。
Selenese からプログラムへ
Selenium RC を使用する主なタスクは、Selenese をプログラミング言語に変換することです。このセクションでは、いくつかの異なる言語固有の例を示します。
サンプルテストスクリプト
まず、Selenese テストスクリプトの例から始めましょう。Selenium-IDE で次のテストを記録することを想像してください。
open | / | |
type | q | selenium rc |
clickAndWait | btnG | |
assertTextPresent | Results * for selenium rc |
注:この例は、Google 検索ページ http://www.google.com で動作します。
プログラミングコードとしての Selenese
以下は、サポートされている各プログラミング言語に(Selenium-IDE 経由で)エクスポートされたテストスクリプトです。オブジェクト指向プログラミング言語の基本的な知識があれば、これらの例のいずれかを読むことで、Selenium が Selenese コマンドをどのように実行するかを理解できるでしょう。特定の言語の例を表示するには、次のいずれかのボタンを選択してください。
CSharp
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using NUnit.Framework;
using Selenium;
namespace SeleniumTests
{
[TestFixture]
public class NewTest
{
private ISelenium selenium;
private StringBuilder verificationErrors;
[SetUp]
public void SetupTest()
{
selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com/");
selenium.Start();
verificationErrors = new StringBuilder();
}
[TearDown]
public void TeardownTest()
{
try
{
selenium.Stop();
}
catch (Exception)
{
// Ignore errors if unable to close the browser
}
Assert.AreEqual("", verificationErrors.ToString());
}
[Test]
public void TheNewTest()
{
selenium.Open("/");
selenium.Type("q", "selenium rc");
selenium.Click("btnG");
selenium.WaitForPageToLoad("30000");
Assert.AreEqual("selenium rc - Google Search", selenium.GetTitle());
}
}
}
Java
/** Add JUnit framework to your classpath if not already there
* for this example to work
*/
package com.example.tests;
import com.thoughtworks.selenium.*;
import java.util.regex.Pattern;
public class NewTest extends SeleneseTestCase {
public void setUp() throws Exception {
setUp("http://www.google.com/", "*firefox");
}
public void testNew() throws Exception {
selenium.open("/");
selenium.type("q", "selenium rc");
selenium.click("btnG");
selenium.waitForPageToLoad("30000");
assertTrue(selenium.isTextPresent("Results * for selenium rc"));
}
}
Php
<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
class Example extends PHPUnit_Extensions_SeleniumTestCase
{
function setUp()
{
$this->setBrowser("*firefox");
$this->setBrowserUrl("http://www.google.com/");
}
function testMyTestCase()
{
$this->open("/");
$this->type("q", "selenium rc");
$this->click("btnG");
$this->waitForPageToLoad("30000");
$this->assertTrue($this->isTextPresent("Results * for selenium rc"));
}
}
?>
Python
from selenium import selenium
import unittest, time, re
class NewTest(unittest.TestCase):
def setUp(self):
self.verificationErrors = []
self.selenium = selenium("localhost", 4444, "*firefox",
"http://www.google.com/")
self.selenium.start()
def test_new(self):
sel = self.selenium
sel.open("/")
sel.type("q", "selenium rc")
sel.click("btnG")
sel.wait_for_page_to_load("30000")
self.failUnless(sel.is_text_present("Results * for selenium rc"))
def tearDown(self):
self.selenium.stop()
self.assertEqual([], self.verificationErrors)
Ruby
require "selenium/client"
require "test/unit"
class NewTest < Test::Unit::TestCase
def setup
@verification_errors = []
if $selenium
@selenium = $selenium
else
@selenium = Selenium::Client::Driver.new("localhost", 4444, "*firefox", "http://www.google.com/", 60);
@selenium.start
end
@selenium.set_context("test_new")
end
def teardown
@selenium.stop unless $selenium
assert_equal [], @verification_errors
end
def test_new
@selenium.open "/"
@selenium.type "q", "selenium rc"
@selenium.click "btnG"
@selenium.wait_for_page_to_load "30000"
assert @selenium.is_text_present("Results * for selenium rc")
end
end
次のセクションでは、生成されたコードを使用してテストプログラムを構築する方法について説明します。
テストのプログラミング
次に、サポートされている各プログラミング言語の例を使用して、独自のテストをプログラミングする方法を説明します。基本的に、2 つのタスクがあります。
- Selenium-IDE からスクリプトをプログラミング言語に生成し、オプションで結果を変更します。
- 生成されたコードを実行する非常にシンプルな main プログラムを記述します。
オプションで、Java に JUnit や TestNG などのテストエンジンプラットフォーム、または .NET に NUnit などを採用できます(これらの言語のいずれかを使用している場合)。
ここでは、言語固有の例を示します。言語固有の API は互いに異なる傾向があるため、それぞれ個別の説明があります。
- Java
- C#
- Python
- Ruby
- Perl、PHP
Java
Java の場合、JUnit または TestNG のいずれかがテストエンジンとして使用されます。
Eclipse などの一部の開発環境では、プラグインを介してこれらを直接サポートしています。これにより、さらに簡単になります。JUnit または TestNG の教示はこのドキュメントの範囲外ですが、資料はオンラインで見つけることができ、出版物も入手可能です。「Java ショップ」である場合、開発者はこれらのテストフレームワークのいずれかの経験を既に持っている可能性があります。
おそらく、テストクラスの名前を「NewTest」から独自の選択肢の名前に変更したいと思うでしょう。また、ステートメントでブラウザを開くパラメータを変更する必要があります。
selenium = new DefaultSelenium("localhost", 4444, "*iehta", "http://www.google.com/");
Selenium-IDE によって生成されたコードは次のようになります。この例には、わかりやすくするために手動でコメントが追加されています。
package com.example.tests;
// We specify the package of our tests
import com.thoughtworks.selenium.*;
// This is the driver's import. You'll use this for instantiating a
// browser and making it do what you need.
import java.util.regex.Pattern;
// Selenium-IDE add the Pattern module because it's sometimes used for
// regex validations. You can remove the module if it's not used in your
// script.
public class NewTest extends SeleneseTestCase {
// We create our Selenium test case
public void setUp() throws Exception {
setUp("http://www.google.com/", "*firefox");
// We instantiate and start the browser
}
public void testNew() throws Exception {
selenium.open("/");
selenium.type("q", "selenium rc");
selenium.click("btnG");
selenium.waitForPageToLoad("30000");
assertTrue(selenium.isTextPresent("Results * for selenium rc"));
// These are the real test steps
}
}
C#
.NET クライアントドライバは Microsoft.NET で動作します。NUnit や Visual Studio 2005 Team System などの任意の .NET テストフレームワークで使用できます。
Selenium-IDE は、NUnit をテストフレームワークとして使用することを前提としています。これは、以下の生成されたコードで確認できます。これには、NUnit の using ステートメントと、テストクラスの各メンバー関数の役割を識別する対応する NUnit 属性が含まれています。
おそらく、テストクラスの名前を「NewTest」から独自の選択肢の名前に変更する必要があります。また、ステートメントでブラウザを開くパラメータを変更する必要があります。
selenium = new DefaultSelenium("localhost", 4444, "*iehta", "http://www.google.com/");
生成されたコードは、これに似たものになります。
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using NUnit.Framework;
using Selenium;
namespace SeleniumTests
{
[TestFixture]
public class NewTest
{
private ISelenium selenium;
private StringBuilder verificationErrors;
[SetUp]
public void SetupTest()
{
selenium = new DefaultSelenium("localhost", 4444, "*iehta",
"http://www.google.com/");
selenium.Start();
verificationErrors = new StringBuilder();
}
[TearDown]
public void TeardownTest()
{
try
{
selenium.Stop();
}
catch (Exception)
{
// Ignore errors if unable to close the browser
}
Assert.AreEqual("", verificationErrors.ToString());
}
[Test]
public void TheNewTest()
{
// Open Google search engine.
selenium.Open("http://www.google.com/");
// Assert Title of page.
Assert.AreEqual("Google", selenium.GetTitle());
// Provide search term as "Selenium OpenQA"
selenium.Type("q", "Selenium OpenQA");
// Read the keyed search term and assert it.
Assert.AreEqual("Selenium OpenQA", selenium.GetValue("q"));
// Click on Search button.
selenium.Click("btnG");
// Wait for page to load.
selenium.WaitForPageToLoad("5000");
// Assert that "www.openqa.org" is available in search results.
Assert.IsTrue(selenium.IsTextPresent("www.openqa.org"));
// Assert that page title is - "Selenium OpenQA - Google Search"
Assert.AreEqual("Selenium OpenQA - Google Search",
selenium.GetTitle());
}
}
}
NUnit にテストの実行を管理させることができます。または、代わりに、テストオブジェクトをインスタンス化し、3 つのメソッド SetupTest()、TheNewTest()、および TeardownTest() を順番に実行するシンプルな main()
プログラムを記述することもできます。
Python
Pyunit は Python で使用するテストフレームワークです。
基本的なテスト構造は次のとおりです。
from selenium import selenium
# This is the driver's import. You'll use this class for instantiating a
# browser and making it do what you need.
import unittest, time, re
# This are the basic imports added by Selenium-IDE by default.
# You can remove the modules if they are not used in your script.
class NewTest(unittest.TestCase):
# We create our unittest test case
def setUp(self):
self.verificationErrors = []
# This is an empty array where we will store any verification errors
# we find in our tests
self.selenium = selenium("localhost", 4444, "*firefox",
"http://www.google.com/")
self.selenium.start()
# We instantiate and start the browser
def test_new(self):
# This is the test code. Here you should put the actions you need
# the browser to do during your test.
sel = self.selenium
# We assign the browser to the variable "sel" (just to save us from
# typing "self.selenium" each time we want to call the browser).
sel.open("/")
sel.type("q", "selenium rc")
sel.click("btnG")
sel.wait_for_page_to_load("30000")
self.failUnless(sel.is_text_present("Results * for selenium rc"))
# These are the real test steps
def tearDown(self):
self.selenium.stop()
# we close the browser (I'd recommend you to comment this line while
# you are creating and debugging your tests)
self.assertEqual([], self.verificationErrors)
# And make the test fail if we found that any verification errors
# were found
Ruby
古い(2.0 より前の)バージョンの Selenium-IDE は、古い Selenium gem を必要とする Ruby コードを生成します。したがって、IDE によって生成された Ruby スクリプトは、次のように更新することをお勧めします。
1 行目で、
require "selenium"
をrequire "selenium/client"
に変更します。11 行目で、
Selenium::SeleniumDriver.new
をSelenium::Client::Driver.new
に変更します。
おそらく、クラス名を「Untitled」よりも情報量の多いものに変更し、テストメソッドの名前を「test_untitled」以外のものに変更したいと思うでしょう。
以下は、前述のように Selenium IDE によって生成された Ruby コードを変更して作成された簡単な例です。
# load the Selenium-Client gem
require "selenium/client"
# Load Test::Unit, Ruby's default test framework.
# If you prefer RSpec, see the examples in the Selenium-Client
# documentation.
require "test/unit"
class Untitled < Test::Unit::TestCase
# The setup method is called before each test.
def setup
# This array is used to capture errors and display them at the
# end of the test run.
@verification_errors = []
# Create a new instance of the Selenium-Client driver.
@selenium = Selenium::Client::Driver.new \
:host => "localhost",
:port => 4444,
:browser => "*chrome",
:url => "http://www.google.com/",
:timeout_in_second => 60
# Start the browser session
@selenium.start
# Print a message in the browser-side log and status bar
# (optional).
@selenium.set_context("test_untitled")
end
# The teardown method is called after each test.
def teardown
# Stop the browser session.
@selenium.stop
# Print the array of error messages, if any.
assert_equal [], @verification_errors
end
# This is the main body of your test.
def test_untitled
# Open the root of the site we specified when we created the
# new driver instance, above.
@selenium.open "/"
# Type 'selenium rc' into the field named 'q'
@selenium.type "q", "selenium rc"
# Click the button named "btnG"
@selenium.click "btnG"
# Wait for the search results page to load.
# Note that we don't need to set a timeout here, because that
# was specified when we created the new driver instance, above.
@selenium.wait_for_page_to_load
begin
# Test whether the search results contain the expected text.
# Notice that the star (*) is a wildcard that matches any
# number of characters.
assert @selenium.is_text_present("Results * for selenium rc")
rescue Test::Unit::AssertionFailedError
# If the assertion fails, push it onto the array of errors.
@verification_errors << $!
end
end
end
Perl、PHP
ドキュメントチームのメンバーは、Perl または PHP で Selenium RC を使用したことがありません。これらの 2 つの言語のいずれかで Selenium RC を使用している場合は、ドキュメントチーム(貢献に関する章を参照)にお問い合わせください。Perl および PHP ユーザーをサポートするために、お客様からの例と経験をぜひ掲載したいと考えています。
API を学ぶ
Selenium RC API は、Selenese を理解していると仮定すると、インターフェースの多くが
自明になるような命名規則を使用しています。ただし、ここでは、最も重要で、おそらくあまり明確でない側面について説明します。
ブラウザの起動
CSharp
selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com/");
selenium.Start();
Java
setUp("http://www.google.com/", "*firefox");
Perl
my $sel = Test::WWW::Selenium->new( host => "localhost",
port => 4444,
browser => "*firefox",
browser_url => "http://www.google.com/" );
Php
$this->setBrowser("*firefox");
$this->setBrowserUrl("http://www.google.com/");
Python
self.selenium = selenium("localhost", 4444, "*firefox",
"http://www.google.com/")
self.selenium.start()
Ruby
@selenium = Selenium::ClientDriver.new("localhost", 4444, "*firefox", "http://www.google.com/", 10000);
@selenium.start
これらの例のそれぞれはブラウザを開き、そのブラウザをプログラム変数に「ブラウザインスタンス」を割り当てることで表します。このプログラム変数は、ブラウザからメソッドを呼び出すために使用されます。これらのメソッドは、open や type、または verify コマンドなどの Selenium コマンドを実行します。
ブラウザインスタンスの作成に必要なパラメータは次のとおりです。
host サーバーが配置されているコンピュータの IP アドレスを指定します。通常、これはクライアントが実行されているマシンと同じであるため、この場合は localhost が渡されます。一部のクライアントでは、これはオプションのパラメータです。
port サーバーがクライアントが接続を確立するのを待機している TCP/IP ソケットを指定します。これも一部のクライアントドライバではオプションです。
browser テストを実行するブラウザ。これは必須パラメータです。
url テスト対象のアプリケーションのベース URL。これはすべてのクライアントライブラリで必須であり、ブラウザ-プロキシ-AUT 通信を起動するための不可欠な情報です。
一部のクライアントライブラリでは、start()
メソッドを呼び出してブラウザを明示的に起動する必要があることに注意してください。
コマンドの実行
ブラウザを初期化して変数(通常は「selenium」という名前)に割り当てたら、ブラウザ変数からそれぞれのメソッドを呼び出すことで、Selenese コマンドを実行させることができます。たとえば、selenium オブジェクトの type メソッドを呼び出すには
selenium.type("field-id","string to type")
バックグラウンドでは、ブラウザは実際には type 操作を実行します。これは、ユーザーがブラウザに入力をタイプするのと本質的に同じです。
メソッド呼び出し中に指定したロケータと文字列を使用します。
結果のレポート
Selenium RC には、結果をレポートするための独自のメカニズムはありません。むしろ、選択したプログラミング言語の機能を使用して、ニーズに合わせてカスタマイズされたレポートを構築できます。それは素晴らしいことですが、すでに完了している簡単なものを単に求めている場合はどうでしょうか?多くの場合、既存のライブラリまたはテストフレームワークは、独自のテストレポートコードを開発するよりも迅速にニーズを満たすことができます。
テストフレームワークのレポートツール
テストフレームワークは、多くのプログラミング言語で利用できます。これらは、テストを実行するための柔軟なテストエンジンを提供するという主要な機能に加えて、結果をレポートするためのライブラリコードを含んでいます。たとえば、Java には JUnit と TestNG という 2 つの一般的なテストフレームワークがあります。.NET にも独自の NUnit があります。
ここではフレームワーク自体を教えることはしません。それはこのユーザーガイドの範囲外です。Selenium に関連するフレームワークの機能と、適用できるいくつかの手法を紹介するだけです。これらのテストフレームワークに関する優れた書籍や、インターネット上の情報があります。
テストレポートライブラリ
また、選択したプログラミング言語でテスト結果をレポートするために特別に作成されたサードパーティライブラリも利用できます。これらは、HTML や PDF などのさまざまな形式をサポートすることがよくあります。
最適なアプローチとは?
テストフレームワークを初めて使用するほとんどの人は、フレームワークの組み込みレポート機能から始めます。そこから、ほとんどの人は利用可能なライブラリを調べます。それは、独自に開発するよりも時間がかからないためです。Selenium を使い始めると、間違いなく進捗状況をレポートするために独自の「print ステートメント」を記述し始めるでしょう。それは、ライブラリまたはテストフレームワークの使用と並行して、独自のレポートの開発につながる可能性があります。いずれにせよ、最初の、しかし短い学習曲線を超えると、自分の状況に最適なものを自然に開発するでしょう。
テストレポートの例
例として、Selenium でサポートされている他の言語のいくつかの特定のツールを紹介します。ここにリストされているものは一般的に使用されており、このガイドの作成者によって広範囲に使用(したがって推奨)されています。
Java でのテストレポート
Selenium テストケースが JUnit を使用して開発されている場合、JUnit Report を使用してテストレポートを生成できます。
Selenium テストケースが TestNG を使用して開発されている場合、テストレポートを生成するために外部タスクは必要ありません。TestNG フレームワークは、テストの詳細をリストする HTML レポートを生成します。
ReportNG は、TestNG フレームワーク用の HTML レポートプラグインです。これは、デフォルトの TestNG HTML レポートの代替として意図されています。ReportNG は、テスト結果のシンプルで色分けされたビューを提供します。
Selenese コマンドのロギング
- Logging Selenium を使用すると、テスト内のすべての Selenese コマンドのレポートを、それぞれの成功または失敗とともに生成できます。Logging Selenium は、Java クライアントドライバを拡張して、この Selenese ロギング機能を追加します。
Python のテストレポート
- Python クライアントドライバを使用する場合、HTMLTestRunner を使用してテストレポートを生成できます。
Ruby のテストレポート
- RSpec フレームワークが Ruby で Selenium テストケースを記述するために使用されている場合、その HTML レポートを使用してテストレポートを生成できます。
テストにスパイスを加える
Selenium RC を使用する理由全体である、プログラミングロジックをテストに追加することについて説明します。これは、任意のプログラムの場合と同じです。プログラムフローは、条件文と反復処理を使用して制御されます。さらに、I/O を使用して進捗情報をレポートできます。このセクションでは、プログラミング言語の構成要素を Selenium と組み合わせて一般的なテスト問題を解決する方法の例をいくつか示します。
ページの要素の存在の簡単なテストから、複数の Web ページとさまざまなデータを含む動的な機能のテストに移行するにつれて、期待される結果を検証するためのプログラミングロジックが必要になることがわかります。基本的に、Selenium-IDE は反復処理と標準の条件文をサポートしていません。Selenese パラメータに JavaScript を埋め込むことでいくつかの条件を実行できますが、反復処理は不可能であり、ほとんどの条件は
プログラミング言語でははるかに簡単になります。さらに、エラー回復のための例外処理が必要になる場合があります。これらの理由などから、自動テストでより優れた「検証力」を提供するために、一般的なプログラミング手法の使用法を示すためにこのセクションを記述しました。
このセクションの例は C# および Java で記述されていますが、コードはシンプルであり、サポートされている他の言語に簡単に適用できます。オブジェクト指向プログラミング言語の基本的な知識があれば、このセクションを理解するのは難しくないはずです。
反復処理
反復処理は、人々がテストで最も頻繁に行うことの 1 つです。たとえば、検索を複数回実行したい場合があります。または、テスト結果を検証するために、データベースから返された「結果セット」を処理する必要がある場合があります。
前に使用したのと同じ Google 検索の例を使用して、Selenium 検索結果を確認しましょう。このテストでは、Selenese を使用できます。
open | / | |
type | q | selenium rc |
clickAndWait | btnG | |
assertTextPresent | Results * for selenium rc | |
type | q | selenium ide |
clickAndWait | btnG | |
assertTextPresent | Results * for selenium ide | |
type | q | selenium grid |
clickAndWait | btnG | |
assertTextPresent | Results * for selenium grid |
コードは、同じ手順を 3 回実行するために繰り返されています。しかし、同じコードの複数のコピーは、保守がより手間がかかるため、適切なプログラミングプラクティスではありません。プログラミング言語を使用することで、検索結果を反復処理して、より柔軟で保守しやすいソリューションを実現できます。
C#
で
// Collection of String values.
String[] arr = {"ide", "rc", "grid"};
// Execute loop for each String in array 'arr'.
foreach (String s in arr) {
sel.open("/");
sel.type("q", "selenium " +s);
sel.click("btnG");
sel.waitForPageToLoad("30000");
assertTrue("Expected text: " +s+ " is missing on page."
, sel.isTextPresent("Results * for selenium " + s));
}
条件文
テストで条件を使用する方法を示すために、例から始めます。Selenium テストの実行中に発生する一般的な問題は、期待される要素がページにない場合に発生します。たとえば、次の行を実行する場合
selenium.type("q", "selenium " +s);
要素 'q' がページにない場合、例外がスローされます
com.thoughtworks.selenium.SeleniumException: ERROR: Element q not found
これにより、テストが中止される可能性があります。一部のテストでは、それが望ましいことです。しかし、多くの場合、テストスクリプトには実行すべき他の多くの後続のテストがあるため、それは望ましくありません。
より良いアプローチは、最初に要素が実際に存在するかどうかを検証し、存在しない場合は代替策を講じることです。Java を使用してこれを見てみましょう。
// If element is available on page then perform type operation.
if(selenium.isElementPresent("q")) {
selenium.type("q", "Selenium rc");
} else {
System.out.printf("Element: " +q+ " is not available on page.")
}
このアプローチの利点は、一部の UI 要素がページにない場合でもテストの実行を継続することです。
テストからの JavaScript の実行
JavaScript は、Selenium で直接サポートされていないアプリケーションを実行する場合に非常に役立ちます。Selenium API の getEval メソッドを使用して、Selenium RC から JavaScript を実行できます。
静的な識別子を持たないチェックボックスを持つアプリケーションを考えてみましょう。この場合、Selenium RC から JavaScript を評価して、すべてのチェックボックスの ID を取得し、それらを実行できます。
public static String[] getAllCheckboxIds () {
String script = "var inputId = new Array();";// Create array in java script.
script += "var cnt = 0;"; // Counter for check box ids.
script += "var inputFields = new Array();"; // Create array in java script.
script += "inputFields = window.document.getElementsByTagName('input');"; // Collect input elements.
script += "for(var i=0; i<inputFields.length; i++) {"; // Loop through the collected elements.
script += "if(inputFields[i].id !=null " +
"&& inputFields[i].id !='undefined' " +
"&& inputFields[i].getAttribute('type') == 'checkbox') {"; // If input field is of type check box and input id is not null.
script += "inputId[cnt]=inputFields[i].id ;" + // Save check box id to inputId array.
"cnt++;" + // increment the counter.
"}" + // end of if.
"}"; // end of for.
script += "inputId.toString();" ;// Convert array in to string.
String[] checkboxIds = selenium.getEval(script).split(","); // Split the string.
return checkboxIds;
}
ページ上の画像の数を数えるには
selenium.getEval("window.document.images.length;");
DOM 式の場合は、デフォルトでは Selenium ウィンドウが参照されるため、テストウィンドウではなく、window オブジェクトを使用することを忘れないでください。
サーバーオプション
サーバーが起動されると、コマンドラインオプションを使用してデフォルトのサーバーの動作を変更できます。
サーバーは、以下を実行することで起動されることを思い出してください。
$ java -jar selenium-server-standalone-<version-number>.jar
オプションのリストを表示するには、-h
オプションを指定してサーバーを実行します。
$ java -jar selenium-server-standalone-<version-number>.jar -h
サーバーで使用できるすべてのオプションと、それぞれの簡単な説明のリストが表示されます。提供されている説明は必ずしも十分ではないため、より重要なオプションのいくつかについて説明しました。
プロキシ設定
AUT が認証を必要とする HTTP プロキシの背後にある場合は、次のコマンドを使用して http.proxyHost、http.proxyPort、http.proxyUser、および http.proxyPassword を構成する必要があります。
$ java -jar selenium-server-standalone-<version-number>.jar -Dhttp.proxyHost=proxy.com -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password
マルチウィンドウモード
Selenium 1.0 を使用している場合は、おそらくこのセクションをスキップできます。マルチウィンドウモードがデフォルトの動作であるためです。ただし、バージョン 1.0 より前では、Selenium はデフォルトでテスト対象のアプリケーションをサブフレームで実行していました(ここに示されているように)。
一部のアプリケーションはサブフレームで正しく実行されず、ウィンドウのトップフレームにロードする必要がありました。マルチウィンドウモードオプションを使用すると、AUT を必要なトップフレームを持つことができるデフォルトのフレームではなく、別のウィンドウで実行できました。
古いバージョンの Selenium の場合、次のオプションを使用してマルチウィンドウモードを明示的に指定する必要があります。
-multiwindow
Selenium RC 1.0 以降では、単一のフレーム内でテストを実行する場合(つまり、以前の Selenium バージョンの標準を使用する場合)、オプションを使用して Selenium Server にこれを伝えることができます。
-singlewindow
Firefox プロファイルの指定
Firefox は、インスタンスごとに個別のプロファイルを指定しない限り、2 つのインスタンスを同時に実行しません。Selenium RC 1.0 以降は個別のプロファイルで自動的に実行されるため、Selenium 1.0 を使用している場合は、おそらくこのセクションをスキップできます。ただし、古いバージョンの Selenium を使用している場合、またはテストに特定のプロファイルを使用する必要がある場合(https 証明書を追加したり、アドオンをインストールしたりするなど)、プロファイルを明示的に指定する必要があります。
まず、個別の Firefox プロファイルを作成するには、次の手順に従います。Windows の [スタート] メニューを開き、[実行] を選択し、次のいずれかを入力して Enter キーを押します。
firefox.exe -profilemanager
firefox.exe -P
ダイアログを使用して新しいプロファイルを作成します。次に、Selenium Server を実行するときに、サーバーコマンドラインオプション -firefoxProfileTemplate を使用して、この新しい Firefox プロファイルを使用するように指示し、そのファイル名とディレクトリパスを使用してプロファイルへのパスを指定します。
-firefoxProfileTemplate "path to the profile"
警告:プロファイルをデフォルトとは別の新しいフォルダに入れるようにしてください。Firefox プロファイルマネージャツールは、プロファイルファイルであるかどうかに関係なく、プロファイルを削除するとフォルダ内のすべてのファイルを削除します。
Firefox プロファイルの詳細については、Mozilla のナレッジベースを参照してください。
-htmlSuite を使用してサーバー内で Selenese を直接実行する
Selenese html ファイルを Selenium Server 内で直接実行するには、html ファイルをサーバーのコマンドラインに渡します。たとえば
java -jar selenium-server-standalone-<version-number>.jar -htmlSuite "*firefox"
"http://www.google.com" "c:\absolute\path\to\my\HTMLSuite.html"
"c:\absolute\path\to\my\results.html"
これにより、HTML スイートが自動的に起動され、すべてのテストが実行され、結果を含む優れた HTML レポートが保存されます。
注:このオプションを使用する場合、サーバーはテストを開始し、テストが完了するまで指定された秒数待機します。テストがその時間内に完了しない場合、コマンドはゼロ以外の終了コードで終了し、結果ファイルは生成されません。
このコマンドラインは非常に長いため、入力するときは注意してください。これには、単一のテストではなく、HTML Selenese スイートを渡す必要があることに注意してください。また、-htmlSuite オプションは -interactive
と互換性がないことにも注意してください。両方を同時に実行することはできません。
Selenium Server のロギング
サーバー側のログ
Selenium サーバーを起動すると、-log オプションを使用して、Selenium Server によってレポートされた貴重なデバッグ情報をテキストファイルに記録できます。
java -jar selenium-server-standalone-<version-number>.jar -log selenium.log
このログファイルは、標準のコンソールログよりも詳細です(DEBUG レベルのロギングメッセージが含まれています)。ログファイルには、ロガー名と、メッセージをログに記録したスレッドの ID 番号も含まれています。例:
20:44:25 DEBUG [12] org.openqa.selenium.server.SeleniumDriverResourceHandler -
Browser 465828/:top frame1 posted START NEW
メッセージ形式は
TIMESTAMP(HH:mm:ss) LEVEL [THREAD] LOGGER - MESSAGE
このメッセージは複数行になる場合があります。
ブラウザ側のログ
ブラウザ側の JavaScript(Selenium Core)も重要なメッセージをログに記録します。多くの場合、これらは通常の Selenium Server ログよりもエンドユーザーにとって役立つ可能性があります。ブラウザ側のログにアクセスするには、-browserSideLog 引数を Selenium Server に渡します。
java -jar selenium-server-standalone-<version-number>.jar -browserSideLog
-browserSideLog は、browserSideLogs(およびその他すべての DEBUG レベルのロギングメッセージ)をファイルにログ記録するために、-log 引数と組み合わせる必要があります。
特定のブラウザへのパスの指定
Selenium RC に特定のブラウザへのパスを指定できます。これは、同じブラウザの異なるバージョンがあり、特定のバージョンを使用したい場合に役立ちます。また、これは、Selenium RC で直接サポートされていないブラウザに対してテストを実行できるようにするために使用されます。実行モードを指定するときは、*custom 指定子に続けて、ブラウザの実行可能ファイルへのフルパスを使用します。
*custom <path to browser>
Selenium RC アーキテクチャ
注:このトピックでは、Selenium RC の背後にある技術的な実装について説明しようとしています。Selenium ユーザーがこれを知っておくことは必須ではありませんが、将来見つかる可能性のある問題を理解するのに役立つ可能性があります。
Selenium RC Server の仕組み、およびプロキシインジェクションと高度な特権モードを使用する理由を詳細に理解するには、まず同一オリジンポリシー
_ について理解する必要があります。
同一オリジンポリシー
Selenium が直面する主な制限は、同一オリジンポリシーです。このセキュリティ制限は、市場のすべてのブラウザによって適用されており、その目的は、あるサイトのコンテンツが別のサイトのスクリプトからアクセスされることがないようにすることです。同一オリジンポリシーは、ブラウザ内でロードされたコードは、そのウェブサイトのドメイン内でのみ動作できると規定しています。別のウェブサイト上で機能を実行することはできません。たとえば、ブラウザが www.mysite.com をロードするときに JavaScript コードをロードした場合、それが別のサイトであっても、www.mysite2.com に対してロードされたコードを実行することはできません。もしこれが可能であれば、開いたウェブサイトに配置されたスクリプトは、銀行口座ページを別のタブで開いている場合に、銀行口座の情報を読み取ることができるようになります。これは XSS (クロスサイトスクリプティング) と呼ばれます。
このポリシー内で動作するためには、Selenium-Core (およびすべての魔法を実行する JavaScript コマンド) は、テスト対象アプリケーション (同じ URL) と同じオリジンに配置する必要があります。
歴史的に、Selenium-Core は JavaScript で実装されていたため、この問題によって制限されていました。しかし、Selenium RC は同一オリジンポリシーによって制限されません。Selenium Server をプロキシとして使用することで、この問題を回避しています。本質的に、ブラウザに、Server が提供する単一の「スプーフされた」ウェブサイト上で動作していると伝えます。
注: このトピックに関する追加情報は、Wikipedia の同一オリジンポリシーと XSS に関するページで確認できます。
プロキシインジェクション
Selenium が同一オリジンポリシーを回避するために使用した最初の方法は、プロキシインジェクションでした。プロキシインジェクションモードでは、Selenium Server はクライアント構成のHTTP プロキシ1として機能し、ブラウザとテスト対象アプリケーション2の間に位置します。そして、AUT を架空の URL の下にマスクし (Selenium-Core とテストのセットを埋め込み、同じオリジンから来たかのように配信します)。
アーキテクチャ図を以下に示します。
お気に入りの言語でテストスイートが開始されると、次のことが起こります。
- クライアント/ドライバは selenium-RC サーバーとの接続を確立します。
- Selenium RC サーバーは、Selenium-Core の JavaScript をブラウザにロードされたウェブページに注入する URL でブラウザを起動 (または古いものを再利用) します。
- クライアントドライバは Selenese コマンドをサーバーに渡します。
- サーバーはコマンドを解釈し、ブラウザ内でそのコマンドを実行するために対応する JavaScript の実行をトリガーします。Selenium-Core は、ブラウザに最初の指示 (通常は AUT のページを開くこと) を実行するように指示します。
- ブラウザは open リクエストを受信し、Selenium RC サーバー (ブラウザが使用する HTTP プロキシとして設定) からウェブサイトのコンテンツを要求します。
- Selenium RC サーバーはウェブサーバーと通信してページを要求し、受信すると、ページが Selenium-Core と同じサーバーから来たように見えるようにオリジンをマスクして、ページをブラウザに送信します (これにより、Selenium-Core は同一オリジンポリシーに準拠できます)。
- ブラウザはウェブページを受信し、それ用に予約されたフレーム/ウィンドウにレンダリングします。
高度な権限を持つブラウザ
このメソッドのワークフローはプロキシインジェクションと非常によく似ていますが、主な違いは、ブラウザが高度な特権と呼ばれる特別なモードで起動されることです。これにより、ウェブサイトは通常許可されていないこと (XSS_ を実行したり、ファイルアップロード入力を入力したり、Selenium にとって非常に便利なことなど) を実行できます。これらのブラウザモードを使用することで、Selenium Core は AUT を直接開き、Selenium RC サーバーを介して AUT 全体を渡すことなく、そのコンテンツを読み取り/操作することができます。
アーキテクチャ図を以下に示します。
お気に入りの言語でテストスイートが開始されると、次のことが起こります。
- クライアント/ドライバは selenium-RC サーバーとの接続を確立します。
- Selenium RC サーバーは、ウェブページに Selenium-Core をロードする URL でブラウザを起動 (または古いものを再利用) します。
- Selenium-Core は、クライアント/ドライバからの最初の指示を取得します (Selenium RC Server への別の HTTP リクエスト経由)。
- Selenium-Core は、最初の指示 (通常は AUT のページを開くこと) を実行します。
- ブラウザは open リクエストを受信し、ウェブサーバーにページを要求します。ブラウザがウェブページを受信すると、それ用に予約されたフレーム/ウィンドウにレンダリングします。
HTTPS とセキュリティポップアップの処理
多くのアプリケーションは、パスワードやクレジットカード情報などの暗号化された情報を送信する必要がある場合、HTTP から HTTPS に切り替えます。これは今日の多くのウェブアプリケーションで一般的です。Selenium RC はこれをサポートしています。
HTTPS サイトが本物であることを保証するために、ブラウザはセキュリティ証明書を必要とします。そうしないと、ブラウザが HTTPS を使用して AUT にアクセスすると、アプリケーションが「信頼されていない」と見なします。これが起こると、ブラウザはセキュリティポップアップを表示しますが、これらのポップアップは Selenium RC を使用して閉じることができません。
Selenium RC テストで HTTPS を扱う場合は、これをサポートし、セキュリティ証明書を処理する実行モードを使用する必要があります。テストプログラムが Selenium を初期化するときに実行モードを指定します。
Selenium RC 1.0 beta 2 以降では、実行モードに *firefox または *iexplore を使用します。Selenium RC 1.0 beta 1 を含む以前のバージョンでは、実行モードに *chrome または *iehta を使用します。これらの実行モードを使用すると、特別なセキュリティ証明書をインストールする必要はありません。Selenium RC が自動的に処理します。
バージョン 1.0 では、実行モード *firefox または *iexplore が推奨されます。ただし、追加の実行モードとして *iexploreproxy および *firefoxproxy があります。これらは下位互換性のためのみに提供されており、レガシーテストプログラムで必要な場合を除き、使用すべきではありません。これらの使用は、セキュリティ証明書の処理や、アプリケーションが追加のブラウザウィンドウを開く場合に複数のウィンドウを実行することに制限が生じます。
Selenium RC の以前のバージョンでは、*chrome または *iehta が HTTPS をサポートし、セキュリティポップアップの処理をサポートする実行モードでした。これらは「実験的モード」と見なされていましたが、非常に安定し、多くの人が使用しました。Selenium 1.0 を使用している場合は、これらの古い実行モードは不要であり、使用すべきではありません。
セキュリティ証明書の解説
通常、ブラウザは、すでに所有しているセキュリティ証明書をインストールすることにより、テスト対象のアプリケーションを信頼します。これはブラウザのオプションまたはインターネットのプロパティで確認できます (AUT のセキュリティ証明書がわからない場合は、システム管理者に問い合わせてください)。Selenium がブラウザをロードすると、ブラウザとサーバー間のメッセージをインターセプトするコードを注入します。ブラウザは、信頼されていないソフトウェアがアプリケーションのように見せかけようとしていると考えます。ポップアップメッセージで警告することで応答します。
これを回避するために、Selenium RC は (これもこれをサポートする実行モードを使用する場合)、ブラウザがアクセスできる場所に、一時的に独自のセキュリティ証明書をクライアントマシンにインストールします。これにより、ブラウザは AUT とは異なるサイトにアクセスしていると思い込み、ポップアップを効果的に抑制します。
Selenium の以前のバージョンで使用されていた別の方法は、Selenium インストールで提供されている Cybervillians セキュリティ証明書をインストールすることでした。ほとんどのユーザーはもはやこれを行う必要はありません。ただし、プロキシインジェクションモードで Selenium RC を実行している場合は、このセキュリティ証明書を明示的にインストールする必要がある場合があります。
追加のブラウザとブラウザ構成のサポート
Selenium API は、Internet Explorer および Mozilla Firefox に加えて、複数のブラウザでの実行をサポートしています。サポートされているブラウザについては、https://selenium.dokyumento.jp ウェブサイトを参照してください。さらに、ブラウザが直接サポートされていない場合でも、テストアプリケーションがブラウザを起動するときに「*custom」実行モード (*firefox または *iexplore の代わりに) を使用して、選択したブラウザに対して Selenium テストを実行できます。これにより、API 呼び出し内でブラウザの実行可能ファイルへのパスを渡します。これは、インタラクティブモードのサーバーからも実行できます。
cmd=getNewBrowserSession&1=*custom c:\Program Files\Mozilla Firefox\MyBrowser.exe&2=http://www.google.com
異なるブラウザ構成でのテストの実行
通常、Selenium RC はブラウザを自動的に構成しますが、「*custom」実行モードを使用してブラウザを起動する場合は、Selenium RC に自動構成を使用せずに、ブラウザをそのまま起動させることができます。
たとえば、次のようにカスタム構成で Firefox を起動できます。
cmd=getNewBrowserSession&1=*custom c:\Program Files\Mozilla Firefox\firefox.exe&2=http://www.google.com
この方法でブラウザを起動する場合は、Selenium Server をプロキシとして使用するようにブラウザを手動で構成する必要があることに注意してください。通常、これはブラウザの環境設定を開き、「localhost:4444」を HTTP プロキシとして指定することを意味しますが、これに関する手順はブラウザによって大きく異なる場合があります。詳細については、ブラウザのドキュメントを参照してください。
Mozilla ブラウザは、起動と停止の方法が異なる可能性があることに注意してください。Mozilla ブラウザの動作をもう少し予測可能にするために、MOZ_NO_REMOTE 環境変数を設定する必要がある場合があります。Unix ユーザーは、シェルスクリプトを使用してブラウザを起動することを避ける必要があります。通常は、バイナリ実行可能ファイル (例: firefox-bin) を直接使用する方が優れています。
一般的な問題のトラブルシューティング
Selenium RC を使い始めるときに、よく遭遇する可能性のある問題がいくつかあります。それらの解決策とともにここに提示します。
サーバーに接続できません
テストプログラムが Selenium Server に接続できない場合、Selenium はテストプログラムで例外をスローします。次のメッセージまたは類似のメッセージが表示されるはずです。
"Unable to connect to remote server (Inner Exception Message:
No connection could be made because the target machine actively
refused it )"
(using .NET and XP Service Pack 2)
このようなメッセージが表示された場合は、Selenium Server を起動していることを確認してください。起動している場合は、Selenium クライアントライブラリと Selenium Server の間の接続に問題があります。
Selenium RC を使い始めるとき、ほとんどの人はテストプログラム (Selenium クライアントライブラリを使用) と Selenium Server を同じマシン上で実行することから始めます。これを行うには、接続パラメータとして「localhost」を使用します。これにより、開始時に潜在的なネットワーク問題の影響を軽減できるため、この方法で開始することをお勧めします。オペレーティングシステムに典型的なネットワーキングおよび TCP/IP 設定がある場合、ほとんど問題はないはずです。実際、多くの人がこの方法でテストを実行することを選択しています。
ただし、リモートマシンで Selenium Server を実行したい場合は、2 台のマシン間に有効な TCP/IP 接続があることを前提として、接続は正常であるはずです。
接続に問題がある場合は、ping、telnet、ifconfig(Unix)/ipconfig (Windows) などの一般的なネットワーキングツールを使用して、有効なネットワーク接続があることを確認できます。これらのツールに慣れていない場合は、システム管理者に支援を求めることができます。
ブラウザをロードできません
わかりました、友好的なエラーメッセージではありませんが、申し訳ありません。Selenium Server がブラウザをロードできない場合、このエラーが表示される可能性があります。
(500) Internal Server Error
これは、次の原因で発生する可能性があります。
- Firefox (Selenium 1.0 より前) は、ブラウザがすでに開いており、別のプロファイルを指定していないため、起動できません。サーバーオプションの Firefox プロファイルに関するセクションを参照してください。
- 使用している実行モードが、マシン上のどのブラウザとも一致しません。プログラムがブラウザを開くときに Selenium に渡したパラメータを確認してください。
- ブラウザへのパスを明示的に指定しましたが (「*custom」を使用 - 上記参照)、パスが正しくありません。パスが正しいことを確認してください。また、ユーザーグループを確認して、ブラウザと「*custom」パラメータに関する既知の問題がないことを確認してください。
Selenium は AUT を見つけられません
テストプログラムがブラウザを正常に起動しても、ブラウザにテスト対象のウェブサイトが表示されない場合、最も可能性の高い原因は、テストプログラムが正しい URL を使用していないことです。
これは簡単に起こりえます。Selenium-IDE を使用してスクリプトをエクスポートすると、ダミーの URL が挿入されます。テスト対象アプリケーションの正しい URL に手動で変更する必要があります。
Firefox がプロファイルの準備中にシャットダウンを拒否しました
これは、Firefox に対して Selenium RC テストプログラムを実行している場合に最も頻繁に発生しますが、すでに Firefox ブラウザセッションが実行されており、Selenium Server を起動したときに別のプロファイルを指定していません。テストプログラムからのエラーは次のようになります。
Error: java.lang.RuntimeException: Firefox refused shutdown while
preparing a profile
サーバーからの完全なエラーメッセージは次のとおりです。
16:20:03.919 INFO - Preparing Firefox profile...
16:20:27.822 WARN - GET /selenium-server/driver/?cmd=getNewBrowserSession&1=*fir
efox&2=http%3a%2f%2fsage-webapp1.qa.idc.com HTTP/1.1
java.lang.RuntimeException: Firefox refused shutdown while preparing a profile
at org.openqa.selenium.server.browserlaunchers.FirefoxCustomProfileLaunc
her.waitForFullProfileToBeCreated(FirefoxCustomProfileLauncher.java:277)
...
Caused by: org.openqa.selenium.server.browserlaunchers.FirefoxCustomProfileLaunc
her$FileLockRemainedException: Lock file still present! C:\DOCUME~1\jsvec\LOCALS
~1\Temp\customProfileDir203138\parent.lock
これを解決するには、別の Firefox プロファイルの指定に関するセクションを参照してください。
バージョン管理の問題
Selenium のバージョンがブラウザのバージョンをサポートしていることを確認してください。たとえば、Selenium RC 0.92 は Firefox 3 をサポートしていません。時には運が良かったり (私はそうでした)、しかし、使用している Selenium のバージョンでサポートされているブラウザのバージョンをチェックすることを忘れないでください。疑問がある場合は、最新リリースの Selenium を最も広く使用されているブラウザのバージョンで使用してください。
サーバー起動時のエラーメッセージ:「(Unsupported major.minor version 49.0)」
このエラーは、正しいバージョンの Java を使用していないことを示しています。Selenium Server には Java 1.5 以降が必要です。
Java のバージョンを再確認するには、コマンドラインからこれを実行します。
java -version
Java のバージョンを示すメッセージが表示されるはずです。
java version "1.5.0_07"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_07-b03)
Java HotSpot(TM) Client VM (build 1.5.0_07-b03, mixed mode)
低いバージョン番号が表示された場合は、JRE を更新するか、PATH 環境変数に追加する必要がある場合があります。
getNewBrowserSession コマンド実行時の 404 エラー
「http://www.google.com/selenium-server/"」のページを開こうとしているときに 404 エラーが発生する場合は、Selenium Server がプロキシとして正しく構成されていないことが原因である必要があります。「selenium-server」ディレクトリは google.com には存在しません。プロキシが正しく構成されている場合にのみ存在するように見えます。プロキシ構成は、firefox、iexplore、opera、または custom でブラウザがどのように起動されるかに大きく依存します。
iexplore: *iexplore を使用してブラウザが起動された場合、Internet Explorer のプロキシ設定に問題がある可能性があります。Selenium Server は、インターネットオプションコントロールパネルでグローバルプロキシ設定を構成しようとします。Selenium Server がブラウザを起動するときに、それらが正しく構成されていることを確認する必要があります。インターネットオプションコントロールパネルを確認してみてください。「接続」タブをクリックし、「LAN の設定」をクリックします。
- テストするアプリケーションにアクセスするためにプロキシを使用する必要がある場合は、「-Dhttp.proxyHost」を指定して Selenium Server を起動する必要があります。詳細については、
プロキシ構成
_ を参照してください。 - プロキシを手動で構成してから、*custom、または *iehta ブラウザランチャーでブラウザを起動することもできます。
- テストするアプリケーションにアクセスするためにプロキシを使用する必要がある場合は、「-Dhttp.proxyHost」を指定して Selenium Server を起動する必要があります。詳細については、
custom: *custom を使用する場合は、プロキシを正しく (手動で) 構成する必要があります。そうしないと、404 エラーが発生します。プロキシ設定を正しく構成したことを再確認してください。プロキシを正しく構成したかどうかを確認するには、ブラウザを意図的に誤って構成してみてください。間違ったプロキシサーバーのホスト名または間違ったポートを使用するようにブラウザを構成してみてください。ブラウザのプロキシ設定を誤って構成することに成功した場合、ブラウザはインターネットに接続できなくなります。これは、関連する設定を調整していることを確認する 1 つの方法です。
他のブラウザ (*firefox、*opera) の場合、プロキシを自動的にハードコードするため、この機能に関する既知の問題はありません。404 エラーが発生し、このユーザーガイドを注意深く読んだ場合は、ユーザーグループに結果を投稿して、ユーザーコミュニティからの助けを求めてください。
アクセス拒否エラー
このエラーの最も一般的な理由は、セッションがドメイン境界を越えて (例: http://domain1 からページにアクセスし、次に http://domain2 からページにアクセスする) 、またはプロトコルを切り替える (http://domainX から https://domainX に移動する) ことによって同一オリジンポリシーに違反しようとしていることです。
このエラーは、JavaScript がまだ利用可能ではない (ページが完全にロードされる前)、またはもはや利用可能ではない (ページがアンロードされ始めた後) UI オブジェクトを見つけようとした場合にも発生する可能性があります。これは、ページのセクションまたはより大きなページとは独立してロードおよび/またはリロードするサブフレームを操作する AJAX ページで最も一般的に発生します。
このエラーは断続的に発生する可能性があります。多くの場合、デバッガのオーバーヘッドがシステムに追加されたときに再現できない競合状態から問題が発生するため、デバッガで問題を再現することは不可能です。アクセス許可の問題については、チュートリアルで詳しく説明されています。同一オリジンポリシー
_、プロキシインジェクション
_ に関するセクションを注意深く読んでください。
ブラウザのポップアップウィンドウの処理
Selenium テスト中に発生する可能性のある「ポップアップ」にはいくつかの種類があります。ポップアップがブラウザによって開始され、AUT によって開始されない場合、Selenium コマンドを実行してこれらのポップアップを閉じることができない場合があります。これらの管理方法を知っておく必要がある場合があります。ポップアップのタイプごとに、異なる方法で対処する必要があります。
HTTP 基本認証ダイアログ: これらのダイアログは、サイトにログインするためのユーザー名/パスワードを要求します。HTTP 基本認証を必要とするサイトにログインするには、
RFC 1738
_ で説明されているように、URL にユーザー名とパスワードを使用します。例: open("http://myusername:myuserpassword@myexample.com/blah/blah/blah")。SSL 証明書の警告: Selenium RC は、プロキシとして有効になっている場合、SSL 証明書を自動的にスプーフしようとします。これについては、HTTPS に関するセクションで詳しく説明しています。ブラウザが正しく構成されている場合、SSL 証明書の警告が表示されることはありませんが、危険な「CyberVillains」SSL 認証局を信頼するようにブラウザを構成する必要がある場合があります。これを行う方法については、HTTPS セクションを再度参照してください。
モーダル JavaScript アラート/確認/プロンプトダイアログ: Selenium は、これらのダイアログを (window.alert、window.confirm、window.prompt を置き換えることによって) 隠蔽しようとするため、ページの実行が停止することはありません。アラートポップアップが表示されている場合は、ページロードプロセス中に発生した可能性があります。これは通常、ページを保護するには早すぎます。Selenese には、アラートおよび確認ポップアップをアサートまたは検証するためのコマンドが含まれています。これらのトピックに関するセクションについては、第 4 章を参照してください。
Linux で、Firefox ブラウザセッションが閉じないのはなぜですか?
Unix/Linux では、「firefox-bin」を直接呼び出す必要があるため、その実行可能ファイルがパス上にあることを確認してください。シェルスクリプトを介して Firefox を実行する場合、ブラウザを強制終了する時間になると、Selenium RC はシェルスクリプトを強制終了し、ブラウザは実行されたままになります。次のように、firefox-bin へのパスを直接指定できます。
cmd=getNewBrowserSession&1=*firefox /usr/local/firefox/firefox-bin&2=http://www.google.com
Firefox *chrome がカスタムプロファイルで動作しません
Firefox プロファイルフォルダ -> prefs.js -> user_pref(“browser.startup.page”, 0); この行を次のようにコメントアウトします: “//user_pref(“browser.startup.page”, 0);” そして、もう一度試してください。
カスタムポップアップを親ページのロード中(つまり、親ページの javascript window.onload() 関数が実行される前)にロードしても大丈夫ですか?
いいえ。Selenium は、ウィンドウがロードされるときにウィンドウ名を決定するためにインターセプターに依存しています。これらのインターセプターは、ウィンドウが onload() 関数の後にロードされた場合に、新しいウィンドウをキャッチするのに最適に機能します。Selenium は、onload 関数の前にロードされたウィンドウを認識しない場合があります。
Linux 上の Firefox
Unix/Linux では、1.0 より前のバージョンの Selenium は、「firefox-bin」を直接呼び出す必要があったため、以前のバージョンを使用している場合は、実際の実行可能ファイルがパス上にあることを確認してください。
ほとんどの Linux ディストリビューションでは、実際の firefox-bin は次の場所にあります。
/usr/lib/firefox-x.x.x/
ここで、x.x.x は現在使用しているバージョン番号です。したがって、そのパスをユーザーのパスに追加するには、次の内容を .bashrc ファイルに追加する必要があります。
export PATH="$PATH:/usr/lib/firefox-x.x.x/"
必要に応じて、次のように、テストで firefox-bin へのパスを直接指定できます。
"*firefox /usr/lib/firefox-x.x.x/firefox-bin"
IE とスタイル属性
Internet Explorer でテストを実行しており、style
属性を使用して要素を見つけることができない場合。例:
//td[@style="background-color:yellow"]
これは Firefox、Opera、または Safari では完全に機能しますが、IE では機能しません。IE は @style
のキーを大文字として解釈します。したがって、ソースコードが小文字であっても、次を使用する必要があります。
//td[@style="BACKGROUND-COLOR:yellow"]
これは、テストが複数のブラウザで動作するように意図されている場合の問題ですが、状況を検出して、IE でのみ機能する代替ロケーターを試すようにテストを簡単にコーディングできます。
*googlechrome ブラウザのシャットダウンでエラー「オブジェクトをプリミティブ値に変換できません」が発生しました
このエラーを回避するには、同一オリジンポリシーチェックを無効にするオプションでブラウザを起動する必要があります。
selenium.start("commandLineFlags=--disable-web-security");
IE でエラーが発生しました - 「アプリケーションウィンドウを開けませんでした。ポップアップブロッカーが有効になっていますか?」
このエラーを回避するには、ブラウザを構成する必要があります。ポップアップブロッカーを無効にし、[ツール] » [オプション] » [セキュリティ] で [保護モードを有効にする] オプションをオフにします。