如何更改WebDriver的语言? [英] How to change the language of a 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:
- 为什么不存在
WebDriver.setAcceptLanguages(Locale)
? - 如何更改直接WebDrivers的语言?
- 我可以在运行时更改语言吗?
- 你们是如何实现WebDriverPool的?还是每次都重新创建它们?
- Why isn't there
WebDriver.setAcceptLanguages(Locale)
? - How to change the language for the dirrerent WebDrivers?
- Can I change the language at runtime?
- How did you guys implement your WebDriverPool or do you recreate them everytime?
推荐答案
我最终创建了一个WebDriverPool,该WebDriverPool为WebDriver类型(例如FirefoxDriver.class)和语言环境(例如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屋!