2012-03-22 19 views
19

Chcę wykonywać testy Selenium w różnych językach. Czy jest możliwa zmiana języka istniejącego WebDriver w czasie wykonywania lub czy muszę ponownie utworzyć instancję przeglądarki?Jak zmienić język WebDrivera?

W tej chwili używam tylko Firefoksa, ale chcę później wykonać testy w różnych przeglądarkach.

W Firefoksie ustawić język tak:

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

ja również wdrożył WebDriverPool, który posiada instancję WebDriver więc może być dzielona między testami. Jeśli język można ustawić tylko w czasie tworzenia, mogę zatrzymać instancję dla każdego locale.

Podsumowując, zastanawiam się, czy czegoś tu nie mam. Dlaczego tak trudno zmienić język? nie powinna istnieć metoda taka jak WebDriver.setAcceptLanguages(Locale)?

W skrócie mam następujące pytania:

  1. Dlaczego nie ma WebDriver.setAcceptLanguages(Locale)?
  2. Jak zmienić język dirrerent WebDrivers?
  3. Czy mogę zmienić język w czasie wykonywania?
  4. W jaki sposób wdrożyliście swój WebDriverPool lub czy odtwarzacie je za każdym razem?
+2

mogę myśleć kilka scenariuszy: Sprawdź datę i formatowanie liczb i wejście dla różnych lokalizacjach, zrzuty ekranu w różnych językach, może pokazać jakąś wskazówkę, jeśli ktoś z nieobsługiwanym języku przychodzi i tak dalej. Twierdzę, że jeśli twoja aplikacja obsługuje wiele języków testowanie jej w wielu może mieć sens w niektórych przypadkach testowych, prawda? –

Odpowiedz

13

Skończyło się na utworzeniu WebDriverPool, który tworzy jedną instancję dla każdej kombinacji typu WebDriver (na przykład FirefoxDriver.class) i ustawień regionalnych (na przykład en_US). Może to jest dla kogoś przydatne.

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

Podoba mi się ta klasa, ale nie rozumiem, dlaczego oceniasz, który WebDriver jest w użyciu ... Czy mogę prosić o wyjaśnienia? –

+0

@Frank: Pytanie brzmi, dlaczego klasa <> clazz jest parametrem metody "getWebDriver"? Wynika to z tego, że klasa testowa wywołująca może zdecydować, jaki rodzaj sterownika ma zostać utworzony. Potrzebujemy tego, ponieważ istnieją testy tylko dla InternetExplorer, ten ActiveX jest używany. –

+0

Nie Nie rozumiem, dlaczego logujesz się, jeśli sterownik jest w użyciu (prywatna lista driversInUse) ... czy to tylko w celu ich właściwego zamknięcia? –

-1

Obawiam się, że cała idea WebDriver jest działać jak przeglądarce - tak można zmienić język przeglądarki, ale trzeba zmienić ustawienia regionalne w systemie operacyjnym lub nadzieję, że wniosek zrobię to za Ciebie.

Na przykład - niemiecki format liczbowy oddziela liczbę dziesiętną przecinkiem i angielskim kropką. Jeśli chcesz sprawdzić, jaki format liczba zachowuje się w angielskiej lokalizacji iw niemieckiej lokalizacji, można to zrobić tylko przez tych dwóch podejść:

  1. Change OS locale z niemieckiego na angielski lub odwrotnie
  2. Zmień przeglądarkę język i mam nadzieję, że aplikacja zmieni to zachowanie.

Aby odpowiedzieć na Twoje pytania:

  1. Nie ma setlocale na Webdriver, ponieważ WebDriver symuluje przeglądarkę, nie OS
  2. zrobiłbym to tak (kod 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. Obawiam się, że musisz zamknąć przeglądarkę i otworzyć ją ponownie w innym języku.

  4. Ja osobiście tworzę nową instancję przeglądarki dla każdego testu.

BTW powyższy bit kodu zakłada, że ​​aplikacja internetowa zmienia sposób wyświetlania liczb użytkownikom w oparciu o język przeglądarki.

+1

Dzięki za odpowiedź, niestety, niewiele mi to pomaga. Mówisz, że ustawienia regionalne mogą być zmieniane tylko na poziomie systemu operacyjnego, to nie jest prawda. Możesz zmienić ustawienia narodowe w przeglądarce Firefox lub Chrome podczas działania iz następnym żądaniem zmieniono "accept_languages" w nagłówku http. Nasza aplikacja używa tego języka do wyboru tekstów i formatów liczb i dat. –

+0

Po drugie, odtworzenie instancji przeglądarki za każdym razem jest bardzo powolne. Powinieneś pomyśleć o implementacji puli dla tego. –

+1

Aby zmienić wartość nagłówka 'Accept-Language' w przeglądarce Chrome, Firefox i Internet Explorer, wystarczy zmienić ustawienia językowe w przeglądarce i ponownie załadować stronę bez modyfikowania jakichkolwiek ustawień systemu operacyjnego. – martin

4

Można to również zrobić za pomocą: config w firefox. Ale musisz użyć Akcji, aby nim manipulować.

Poniżej kawałek java kodu

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(); 
Powiązane problemy