プログラミング言語の選択

WebDriver: 高度な使用法??

明示及び暗黙の Wait??

Wait は自動化されたタスクの実行を次のステップに進む前に一定時間止めます。

明示の Wait??

明示の Wait はプログラムの中で先へ進む前にある条件を待つようにコーディングします。最もひどい例は Thread.sleep() を使うことでこれは決まった時間 Wait を行います。本当に必要なだけ Wait を行うために幾つか便利な方法があります。 WebDriverWait と ExpectedCondition を使うのが一つの方法です。

WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
  .until(new ExpectedCondition<WebElement>(){
	@Override
	public WebElement apply(WebDriver d) {
		return d.findElement(By.id("myDynamicElement"));
	}});
IWebDriver driver = new FirefoxDriver();
driver.Url = "http://somedomain/url_that_delays_loading";
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement myDynamicElement = wait.Until<IWebElement>((d) =>
    {
        return d.FindElement(By.Id("someDynamicElement"));
    });
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait # 2.4.0 より利用可能

ff = webdriver.Firefox()
ff.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(ff, 10).until(lambda driver : driver.find_element_by_id("myDynamicElement"))
finally:
    ff.quit()
require 'rubygems' # ruby 1.9 もしくは gem なしでインストールしたのであれば不要
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.get "http://somedomain/url_that_delays_loading"

wait = Selenium::WebDriver::Wait.new(:timeout => 10) # 秒
begin
  element = wait.until { driver.find_element(:id => "some-dynamic-element") }
ensure
  driver.quit
end

これは10秒後に TimeoutException を投げるか、又は10秒以内に要素を見つけて戻ります。 WebDriverWait は「成功」を返して戻る迄、デフォルトで ExpectedCondition を 500ミリ秒毎に呼び出します。「成功」を示す ExpectedCondition の戻り値は Boolean 型の true もしくはそれ以外の ExpectedCondition の型の場合は NULL 以外の値が返ります。

この例は暗黙の Wait の最初の例と機能的に同一です。

暗黙の Wait??

暗黙の Wait では WebDriver は要素がすぐに見つからない場合、一定時間の間、DOM を監視し続け要素を見つけようとします。デフォルトの時間は0です。設定されると WebDriver のオブジェクトインスタンスが生存している限り暗黙の Wait が続きます。

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));
WebDriver driver = new FirefoxDriver();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
driver.Url = "http://somedomain/url_that_delays_loading";
IWebElement myDynamicElement = driver.FindElement(By.Id("someDynamicElement"));
from selenium import webdriver

ff = webdriver.Firefox()
ff.implicitly_wait(10) # seconds
ff.get("http://somedomain/url_that_delays_loading")
myDynamicElement = ff.find_element_by_id("myDynamicElement")
require 'rubygems' # ruby 1.9 もしくは gem なしでインストールした場合は不要
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.manage.timeouts.implicit_wait = 10 # 秒

driver.get "http://somedomain/url_that_delays_loading"
element = driver.find_element(:id => "some-dynamic-element")

RemoteWebDriver??

スクリーンショットの取得??

import java.io.File;
import java.net.URL;

import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.Augmenter;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

public class Testing {
    
    public void myTest() throws Exception {
        WebDriver driver = new RemoteWebDriver(
                                new URL("http://localhost:4444/wd/hub"), 
                                DesiredCapabilities.firefox());
        
        driver.get("http://www.google.com");
        
        // RemoteWebDriver は TakesScreenshotクラスを実装していない。
        // ドライバーにスクリーンショットを取得する機能があるなら
        // TakesScreenshot メソッドをインスタンスに追加して下さい。
        WebDriver augmentedDriver = new Augmenter().augment(driver);
        File screenshot = ((TakesScreenshot)augmentedDriver).
                            getScreenshotAs(OutputType.FILE);
    }
}
// このクラスをコードに追加して RemoteWebDriver の代わりに使用して下さい。// ITakesScreenshot にキャストして GetScreenshot を呼び出すことができます。

public class ScreenShotRemoteWebDriver : RemoteWebDriver, ITakesScreenshot
{
       public ScreenShotRemoteWebDriver(Uri RemoteAdress, ICapabilities capabilities)

       : base(RemoteAdress, capabilities)
       {           
       }

       /// <要約>
       /// <see cref="Screenshot"/> スクリーン上のページイメージのオブジェクトの取得
       /// </要約>
       /// <戻り値>A <see cref="Screenshot"/> イメージオブジェクト</戻り値>
       public Screenshot GetScreenshot()
       {
           // スクリーンショットを base64 で取得
           Response screenshotResponse = this.Execute(DriverCommand.Screenshot, null);
           string base64 = screenshotResponse.Value.ToString();

           // ... 変換
           return new Screenshot(base64);
       }
}

// 上記をを使用するには:

ScreenShotRemoteWebDriver webDriver = new ScreenShotRemoteWebDriver(new Uri("http://127.0.0.1:4444/wd/hub"), DesiredCapabilities.Firefox());

// ... webDriver を呼び出して
Screenshot ss = ((ITakesScreenshot)webDriver).GetScreenshot();
string screenshot = ss.AsBase64EncodedString;

byte[] screenshotAsByteArray = ss.AsByteArray;
ss.SaveAsFile(activeDir + TestSuiteName + "//" + FileNanme + imageFormat, ImageFormat.Jpeg);

from selenium import webdriver

driver = webdriver.Remote("http://localhost:4444/wd/hub", webdriver.DesiredCapabilities.FIREFOX)

driver.get("http://www.google.com")
driver.get_screenshot_as_file('/Screenshots/google.png')
from selenium import webdriver

driver = webdriver.Remote("http://localhost:4444/wd/hub", webdriver.DesiredCapabilities.FIREFOX)
driver.get("http://www.google.com")
driver.get_screenshot_as_file('/Screenshots/google.png')
require 'rubygems'
require 'selenium-webdrier'

begin
  driver = Selenium::WebDriver.for :remote, :url => "http://localhost:4444/wd/hub", :desired_capabilities => :firefox
  driver.get "http://www.google.com"
  driver.save_screenshot "/Screenshots/google.png"
ensure
  driver.quit
end

高度な会話??

未執筆

ブラウザスタートアップ時の操作??

未執筆

含まれるトピック:

  • クッキーの復元
  • FireFox プロファイルの変更
  • プラグインの使用

プロキシーの使用??

Internet Explorer??

最も簡単で推奨出来る方法はテストをするマシン上で手動でプロキシーをセットする方法です。 それが出来ないか、異なる設定やプロキシーでテストを行いたい場合、Capabilities オブジェクトを使用する次の方法でシステムのプロキシー設定を一時的に変更することができます。テストが終わった後は元の状態に戻ります。

String PROXY = "localhost:8080";

org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy();
proxy.setHttpProxy(PROXY)
     .setFtpProxy(PROXY)
     .setSslProxy(PROXY);
DesiredCapabilities cap = new DesiredCapabailities();
cap.setPreference(CapabilityType.PROXY, proxy);

WebDriver driver = new InternetExplorerDriver(cap);
from selenium import webdriver

PROXY = "localhost:8080"

webdriver.DesiredCapabilities.INTERNETEXPLORER['proxy'] = {
    "httpProxy":PROXY,
    "ftpProxy":PROXY,
    "sslProxy":PROXY,
    "noProxy":None,
    "proxyType":"MANUAL",
    "class":"org.openqa.selenium.Proxy",
    "autodetect":False
}

# リモートで使用して下さい。そうでなければシステムのプロキシー設定を
# 動的に変更するよう python でコーディングする必要があります。
driver = webdriver.Remote("http://localhost:4444/wd/hub", webdriver.DesiredCapabilities.INTERNETEXPLORER)
require 'rubygems' 
require 'selenium-webdriver'

PROXY = "localhost:8080"

caps = Selenium::WebDriver::Remote::Capabilities.ie(:proxy => Selenium::WebDriver::Proxy.new(
  :http => PROXY,
  :ftp=>PROXY,
  :ssl=>PROXY,
  :no_proxy=>nil
))
# リモートで使用して下さい。そうでなければシステムのプロキシー設定を
# 動的に変更するよう ruby でコーディングする必要があります。
driver = Selenium::WebDriver.for :remote,  :url => "http://localhost:4444/wd/hub", :desired_capabilities => caps

Chrome??

基本的に Internet Explorer と同一です。IE (Window 上の)と同じマシン設定を使用します。 Mac では システム設定 -> ネットワーク設定 を使用します。Linux (Ubuntu) では システム > 設定 > ネットワークプロキシー設定 (もしくは “/etc/environment” set http_proxy) を使用します。この原稿を書いている時点でプログラムによるプロキシーの設定方法は不明です。

Firefox??

Firefox ではプロキシーの設定をプロファイルで行います。以下の例のように FireFox プロファイル上に予めセットするかオンザフライで作成したプロファイル上にセットすることができます。

String PROXY = "localhost:8080";

org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy();
proxy.setHttpProxy(PROXY)
     .setFtpProxy(PROXY)
     .setSslProxy(PROXY);
DesiredCapabilities cap = new DesiredCapabailities();
cap.setPreference(CapabilityType.PROXY, proxy);
WebDriver driver = new FirefoxDriver(cap);
from selenium import webdriver

PROXY_HOST = "host"
PROXY_PORT = 8080

fp = webdriver.FirefoxProfile()

# Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5
fp.set_preference("network.proxy.type", 1)

fp.set_preference("network.proxy.http", PROXY_HOST)
fp.set_preference("network.proxy.http_port", PROXY_PORT)
fp.set_preference("network.proxy.ftp", PROXY_HOST)
fp.set_preference("network.proxy.ftp_port", PROXY_PORT)
fp.set_preference("network.proxy.ssl", PROXY_HOST)
fp.set_preference("network.proxy.ssl_port", PROXY_PORT)

fp.set_preference("network.proxy.no_proxies_on", "") # 希望の値をセットして下さい。

driver = webdriver.Firefox(firefox_profile=fp)
require 'rubygems'
require 'selenium-webdriver'

PROXY = 'localhost:8087'

profile = Selenium::WebDriver::Firefox::Profile.new
profile.proxy = Selenium::WebDriver::Proxy.new(
  :http => PROXY,
  :ftp => PROXY,
  :ssl => PROXY,
  :no_proxy => nil
)

driver = Selenium::WebDriver.for :firefox, :profile => profile

Opera??

未執筆

HTML5??

未執筆

テストの並行動作??

未執筆