如何更改 WebDriver 的语言? [英] How to change the language of a WebDriver?

查看:28
本文介绍了如何更改 WebDriver 的语言?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想用不同的语言执行我的 Selenium 测试.是否可以在运行时更改现有 WebDriver 的语言,还是必须重新创建浏览器实例?

I want to execute my Selenium tests in different languages. Is it possible to change the language of an existing WebDriver at runtime or do I have to recreate the browser instance?

目前我只使用 Firefox,但我想稍后在不同的浏览器中执行测试.

Right now I'm only using Firefox, but I want to execute tests in different browsers at some later point.

在 Firefox 中,我将语言设置为:

In Firefox I set the language like this:

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

我还实现了一个 WebDriverPool,它包含一个 WebDriver 实例,因此它可以在测试之间共享.如果语言只能在创建时设置,我可以为每个语言环境保存一个实例.

I also implemented a WebDriverPool, which holds a WebDriver instance so it can be shared among tests. If the language can only be set at creation time, I could hold an instance for every locale.

总而言之,我想知道我是否在这里错过了什么.为什么改语言这么难?不应该有像 WebDriver.setAcceptLanguages(Locale) 这样的方法吗?

All in all I wonder if I miss something here. Why is it so hard to change the language? shouldn't there be a method like WebDriver.setAcceptLanguages(Locale)?

简而言之,我有这些问题:

In a nutshell I have these questions:

  1. 为什么没有WebDriver.setAcceptLanguages(Locale)?
  2. 如何更改 dirrerent WebDrivers 的语言?
  3. 我可以在运行时更改语言吗?
  4. 你们是如何实现 WebDriverPool 的,还是每次都重新创建它们?

推荐答案

我最终创建了一个 WebDriverPool,它为 WebDriver 类型(例如 FirefoxDriver.class)和 Locale(例如 en_US)的每种组合创建一个实例.也许这对某人有用.

I ended up creating a WebDriverPool that creates one instance for every combination of WebDriver type (e.g. FirefoxDriver.class) and Locale (e.g. en_US). Maybe this is usful for someone.

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);
  }
}

这篇关于如何更改 WebDriver 的语言?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆