2012-03-22 14 views
19

मैं विभिन्न भाषाओं में अपने सेलेनियम परीक्षण निष्पादित करना चाहता हूं। क्या रनटाइम पर किसी मौजूदा वेबड्राइवर की भाषा को बदलना संभव है या क्या मुझे ब्राउजर इंस्टेंस को फिर से बनाना है?वेबड्राइवर की भाषा कैसे बदलें?

अभी मैं केवल फ़ायरफ़ॉक्स का उपयोग कर रहा हूं, लेकिन मैं कुछ बाद के बिंदुओं पर विभिन्न ब्राउज़रों में परीक्षण निष्पादित करना चाहता हूं।

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

मैं भी एक WebDriverPool है, जो एक WebDriver उदाहरण रखती है तो यह परीक्षण के बीच साझा किया जा सकता है लागू किया:

Firefox में मैं इस तरह की भाषा निर्धारित किया है। अगर भाषा केवल निर्माण समय पर ही सेट की जा सकती है, तो मैं प्रत्येक लोकेल के लिए एक उदाहरण रख सकता हूं।

सब कुछ मुझे आश्चर्य है कि अगर मुझे यहां कुछ याद आती है। भाषा को बदलने में इतना मुश्किल क्यों है? WebDriver.setAcceptLanguages(Locale) जैसी कोई विधि नहीं होनी चाहिए?

  1. क्यों WebDriver.setAcceptLanguages(Locale) नहीं है:

    संक्षेप में मैं इन प्रश्न हैं?

  2. dirrerent webDrivers के लिए भाषा कैसे बदलें?
  3. क्या मैं रनटाइम पर भाषा बदल सकता हूं?
  4. आपने अपने वेबड्राइवरपूल को कैसे लागू किया है या आप उन्हें हर बार फिर से बनाते हैं?
+2

मैं कई परिदृश्य के बारे में सोच सकते हैं: अलग अलग स्थानों के लिए तिथि और संख्या स्वरूपण और इनपुट की जाँच करें, अलग अलग भाषाओं में स्क्रीनशॉट लेने, हो सकता है कुछ संकेत दिखाई देते हैं यदि किसी असमर्थित भाषा के साथ किसी साथ आता है। मैं तर्क दूंगा कि, यदि आपका वेबपैप कई भाषाओं में परीक्षण करने का समर्थन करता है तो कुछ परीक्षण मामलों के लिए सही हो सकता है, है ना? –

उत्तर

13

मैंने एक वेबड्राइवरपूल बनाने का अंत किया जो वेबड्रिवर प्रकार (जैसे फ़ायरफ़ॉक्स ड्रायवर.क्लास) और लोकेल (जैसे 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); 
    } 
} 
+0

मुझे वह कक्षा पसंद है लेकिन मुझे नहीं पता कि आप किस वेबड्राइवर का उपयोग कर रहे हैं इसका मूल्यांकन क्यों करें ... क्या मुझे आपकी व्याख्या हो सकती है? –

+0

@ फ्रैंक: आपका प्रश्न है, क्लास <> क्लैज "getWebDriver" विधि का पैरामीटर क्यों है? ऐसा इसलिए है क्योंकि कॉलिंग टेस्ट क्लास तय कर सकती है कि किस प्रकार का ड्राइवर बनाया जाना चाहिए। हमें इसकी आवश्यकता है, क्योंकि केवल InternetExplorer के लिए परीक्षण हैं, यह ActiveX का उपयोग किया जाता है। –

+0

नहीं, मुझे नहीं पता कि ड्राइवर का उपयोग क्यों किया जाता है (निजी सूची ड्राइवर इनयूसे) ... क्या यह सिर्फ उन्हें ठीक से बंद करने के लिए है? –

-1

मुझे डर है WebDriver के पूरे विचार ब्राउज़र की तरह काम करने के लिए है कि कर रहा हूँ - तो आप ब्राउज़र की भाषा बदल सकते हैं, लेकिन आप ऑपरेटिंग सिस्टम में स्थान बदलना है, या अनुप्रयोग है कि आशा है कि यह तुम्हारे लिए करेगा।

उदाहरण के लिए - जर्मन संख्या प्रारूप डॉट द्वारा अल्पविराम और अंग्रेजी द्वारा दशमलव संख्या को अलग करता है। अंग्रेजी जर्मन से

  1. ओएस बदलें स्थान या ठीक इसके विपरीत
  2. ब्राउज़र बदलें: आप परीक्षण करने के लिए, कैसे संख्या स्वरूप अंग्रेजी स्थान में और जर्मन भाषा में बर्ताव करता है चाहते हैं, आप केवल इन दो दृष्टिकोण से यह कर सकते हैं भाषा और आशा है कि आवेदन व्यवहार को बदल देगा।

    1. , Webdriver पर कोई setLocale नहीं है क्योंकि WebDriver ब्राउज़र, नहीं ओएस
    2. simulates मैं इस (जावा कोड) जैसे कि यह करना होगा::

      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. मुझे डर है कि आपको ब्राउज़र बंद करना होगा और इसे अलग-अलग भाषा के साथ फिर से खोलना होगा।

  4. मैं व्यक्तिगत रूप से प्रत्येक परीक्षण के लिए ब्राउज़र का नया उदाहरण बना देता हूं।

बीटीडब्ल्यू उपर्युक्त कोड मानता है कि वेब एप्लिकेशन ब्राउज़र भाषा के आधार पर उपयोगकर्ता को संख्याओं को दिखाने का तरीका बदलता है।

+1

आपके उत्तर के लिए धन्यवाद, दुख की बात है कि यह मेरी मदद नहीं करता है। आप कहते हैं कि लोकेल केवल ओएस स्तर पर बदला जा सकता है, यह सच नहीं है। चल रहे समय और अगले अनुरोध के साथ आप फ़ायरफ़ॉक्स या क्रोम में लोकेल को बदल सकते हैं, http हेडर में "accept_languages" बदल दिया गया है। ग्रंथों और प्रारूप संख्याओं और तिथियों को चुनने के लिए हमारा आवेदन इस भाषा का उपयोग करता है। –

+0

दूसरा, ब्राउजर इंस्टेंस को हर बार दोबारा बनाना बहुत धीमा है। इसके लिए आपको पूल लागू करने के बारे में सोचना चाहिए। –

+1

क्रोम, फ़ायरफ़ॉक्स और इंटरनेट एक्सप्लोरर में 'स्वीकार्य-भाषा'-शीर्षलेख के मान को प्रभावित करने के लिए, ब्राउज़र के अंदर भाषा सेटिंग्स को बदलने और किसी ओएस सेटिंग्स को संशोधित किए बिना पृष्ठ को फिर से लोड करना पर्याप्त है। – martin

4

आप इसे फ़ायरफ़ॉक्स में कॉन्फ़िगरेशन के बारे में भी कर सकते हैं। लेकिन आपको इसे क्रियान्वित करने के लिए क्रियाओं का उपयोग करने की आवश्यकता है।

कोड का एक जावा टुकड़ा नीचे

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(); 
संबंधित मुद्दे