如何更改WebDriver的语言?

时间:2012-03-22 12:56:09

标签: webdriver locale selenium-webdriver

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

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

在Firefox中,我设置了这样的语言:

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

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

总而言之,我想知道我是否会错过这里的一些东西。为什么改变语言这么难?不应该有WebDriver.setAcceptLanguages(Locale)的方法吗?

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

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

3 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:5)

你也可以通过about:config在firefox中完成。但是你需要使用Actions来操纵它。

在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();

答案 2 :(得分:-1)

我担心WebDriver的整个想法就像浏览器一样 - 所以你可以改变浏览器的语言,但是你必须改变操作系统中的语言环境,或者希望该应用程序将为您完成。

例如 - 德语数字格式用逗号和英语逐点分隔十进制数。如果要测试数字格式在英语语言环境和德语语言环境中的行为方式,则只能通过以下两种方法进行测试:

  1. 将操作系统区域设置从德语更改为英语,反之亦然
  2. 更改浏览器语言,希望应用程序改变行为。
  3. 回答你的问题:

    1. Webdriver上没有setLocale,因为WebDriver模拟浏览器,而不是OS
    2. 我会这样做(Java代码):

      private WebDriver driver;  
      
      public enum Language {en-us, de}
      
      public WebDriver getDriver(Language lang){
        String locale = lang.toString();
        FirefoxProfile profile = new FirefoxProfile();
        profile.setPreference("intl.accept_languages", locale);
        driver = new FirefoxDriver(profile);   
        return driver;       
      }
      
      @Test
      public void TestNumber(){
        WebDriver drv = getDriver(Language.en);
        drv.get("http://the-site.com");
        WebElement el = drv.findElement //... find element
        String number = el.getText();
        Assert.assertEquals(number, "123.45");
        drv.close();
        drv = getDriver(Language.de);
        drv.get("http://the-site.com");
        WebElement el = drv.findElement //... find element
        String number = el.getText();
        Assert.assertEquals(number, "123,45");
        drv.close();
      }
      
    3. 我担心您必须关闭浏览器并使用其他语言再次打开它。

    4. 我个人为每个测试创建了新的浏览器实例。
    5. 上面的代码假设,Web应用程序改变了如何根据浏览器语言向用户显示数字的方式。

相关问题