Подтвердить что ты не робот

Как изменить язык 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)?

В двух словах у меня есть следующие вопросы:

  • Почему там нет WebDriver.setAcceptLanguages(Locale)?
  • Как изменить язык для dirrerent WebDrivers?
  • Можно ли изменить язык во время выполнения?
  • Как вы, ребята, внедряете свой WebDriverPool или каждый раз их воссоздаете?
4b9b3361

Ответ 1

В результате я создал 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);
  }
}

Ответ 2

Вы также можете сделать это через: 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 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();

Ответ 3

Я боюсь, что вся идея WebDriver действовать как браузер, поэтому вы можете изменить язык браузера, но вам нужно изменить языковой стандарт в операционной системе или надеяться, что приложение сделает это за вас.

Например, немецкий формат номера разделяет десятичное число по запятой и по-английски по точкам. Если вы хотите протестировать, как формат чисел ведет себя в английском языке и в немецком языке, вы можете сделать это только этими двумя подходами:

  • Изменить языковой стандарт ОС с немецкого на английский или наоборот
  • Измените язык браузера и надейтесь, что приложение изменит поведение.

Чтобы ответить на ваши вопросы:

  • В Webdriver нет setLocale, потому что WebDriver имитирует браузер, а не OS
  • Я бы сделал это так (код 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();
    }
    
  • Я боюсь, что вам нужно закрыть браузер и снова открыть его на другом языке.

  • Я лично создаю новый экземпляр браузера для каждого теста.

Кстати, вышеупомянутый бит кода предполагает, что веб-приложение изменяет способ отображения номеров пользователю на основе языка браузера.