web-dev-qa-db-ja.com

WebDriverの言語を変更するにはどうすればよいですか?

Seleniumテストをさまざまな言語で実行したい。実行時に既存のWebDriverの言語を変更することは可能ですか、それともブラウザーインスタンスを再作成する必要がありますか?

現在、Firefoxのみを使用していますが、後で別のブラウザーでテストを実行したいと考えています。

Firefoxでは、次のように言語を設定しました。

_FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("intl.accept_languages", "de");
WebDriver driver = new FirefoxDriver(profile);
_

また、WebDriverインスタンスを保持するWebDriverPoolを実装して、テスト間で共有できるようにしました。言語を作成時にのみ設定できる場合は、すべてのロケールのインスタンスを保持できます。

全体として、ここで何かが恋しいのではないかと思います。言語を変えるのがとても難しいのはなぜですか? WebDriver.setAcceptLanguages(Locale)のようなメソッドがあるべきではありませんか?

一言で言えば、私はこれらの質問があります:

  1. なぜWebDriver.setAcceptLanguages(Locale)がないのですか?
  2. 異なるWebDriverの言語を変更するにはどうすればよいですか?
  3. 実行時に言語を変更できますか?
  4. WebDriverPoolをどのように実装しましたか、それとも毎回再作成しますか?
20
Tim Büthe

最終的に、WebDriverタイプ(例:FirefoxDriver.class)とロケール(例:en_US)の組み合わせごとに1つのインスタンスを作成するWebDriverPoolを作成しました。多分これは誰かにとって有用です。

public class WebDriverPool {

  private Map<String, WebDriver> drivers = new HashMap<String, WebDriver>();
  private List<WebDriver> driversInUse = new ArrayList<WebDriver>();

  public WebDriverPool() {
    Runtime.getRuntime().addShutdownHook(new Thread(){
      @Override
      public void run(){
        for (WebDriver driver : drivers.values())
          driver.close();

        if (!driversInUse.isEmpty())
          throw new IllegalStateException("There are still drivers in use, did someone forget to return it? (size: " + driversInUse.size() + ")");
      }
    });
  }

  private WebDriver createFirefoxDriver(Locale locale){
    FirefoxProfile profile = new FirefoxProfile();
    profile.setPreference("intl.accept_languages", formatLocale(locale));
    return new FirefoxDriver(profile);
  }

  private String formatLocale(Locale locale) {
    return locale.getCountry().length() == 0
      ? locale.getLanguage()
      : locale.getLanguage() + "-" + locale.getCountry().toLowerCase();
  }

  /**
   * @param clazz
   * @param locale
   * @return web driver which can be new or recycled
   */
  public synchronized WebDriver getWebDriver(Class<? extends WebDriver> clazz, Locale locale){

    String key = clazz.getName() + "-" + locale;

    if(!drivers.containsKey(key)){

      if(clazz == FirefoxDriver.class){
        drivers.put(key, createFirefoxDriver(locale));
      }

      // TODO create other drivers here ...

      // else if(clazz == ChromeDriver.class){
      //     drivers.put(key, createChromeDriver(locale));
      // }

      else{
        throw new IllegalArgumentException(clazz.getName() + " not supported yet!");
      }
    }

    WebDriver driver = drivers.get(key);

    if(driversInUse.contains(driver))
      throw new IllegalStateException("This driver is already in use. Did someone forgot to return it?");

    driversInUse.add(driver);
    return driver;
  }

  public synchronized void returnWebDriver(WebDriver driver){
    driversInUse.remove(driver);
  }
}
13
Tim Büthe

Firefoxのabout:configを使用して実行することもできます。ただし、アクションを使用して操作する必要があります。

Javaコードの一部の下

    Actions act = new Actions(webDriver);          

    webDriver.get("about:config");

    // warning screen
    act.sendKeys(Keys.RETURN).perform();

    // Go directly to the list, don't use the search option, it's not fast enough
    act.sendKeys(Keys.TAB).perform();

    // Go to the intl.accept_languages option
    act.sendKeys("intl.accept_languages").sendKeys(Keys.RETURN).perform();

    // fill the alert with your parameters
    webDriver.switchTo().alert().sendKeys("fr, fr-fr, en-us, en");
    webDriver.switchTo().alert().accept();
5
Cedric