Как изменить язык 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 или каждый раз их воссоздаете?
Ответы
Ответ 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();
}
-
Я боюсь, что вам нужно закрыть браузер и снова открыть его на другом языке.
- Я лично создаю новый экземпляр браузера для каждого теста.
Кстати, вышеупомянутый бит кода предполагает, что веб-приложение изменяет способ отображения номеров пользователю на основе языка браузера.