Seleniumテストをさまざまな言語で実行したい。実行時に既存のWebDriverの言語を変更することは可能ですか、それともブラウザーインスタンスを再作成する必要がありますか?
現在、Firefoxのみを使用していますが、後で別のブラウザーでテストを実行したいと考えています。
Firefoxでは、次のように言語を設定しました。
_FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("intl.accept_languages", "de");
WebDriver driver = new FirefoxDriver(profile);
_
また、WebDriverインスタンスを保持するWebDriverPoolを実装して、テスト間で共有できるようにしました。言語を作成時にのみ設定できる場合は、すべてのロケールのインスタンスを保持できます。
全体として、ここで何かが恋しいのではないかと思います。言語を変えるのがとても難しいのはなぜですか? WebDriver.setAcceptLanguages(Locale)
のようなメソッドがあるべきではありませんか?
一言で言えば、私はこれらの質問があります:
WebDriver.setAcceptLanguages(Locale)
がないのですか?最終的に、WebDriverタイプ(例:FirefoxDriver.class)とロケール(例:en_US)の組み合わせごとに1つのインスタンスを作成するWebDriverPoolを作成しました。多分これは誰かにとって有用です。
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);
}
}
Firefoxのabout:configを使用して実行することもできます。ただし、アクションを使用して操作する必要があります。
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();