2013-03-02 7 views
6

मैं SeleniumHQ इस्तेमाल किया अपने कार्यों रिकॉर्ड करने के लिए और फिर उन्हें जावा एकता WebDrive को निर्यात में बेतरतीब ढंग से लटका हुआ है। तब मैं निर्यात कोड संपादित और सरणी, समय टिकटें, आदि पर पाशन की तरह कई छोटे अतिरिक्त बातें जोड़ासेलेनियम HtmlUnitDriver यादृच्छिक स्थानों

मेरे कोड निम्नलिखित है: मेरी साइट में

  1. प्रवेश करें।
  2. गोटो मेरा प्रोफाइल।
  3. मेरी पिछली घोषणा हटाएं।
  4. नई घोषणा पोस्ट करें।
  5. लॉग आउट करें।

मैंने FirefoxDriver और HtmlUnitDriver का उपयोग करने का प्रयास किया है, लेकिन उनमें से प्रत्येक मुझे यह अजीब समस्या देता है। मेरा कोड अपना काम करना शुरू कर देता है और यादृच्छिक रूप से यादृच्छिक स्थान पर रुक जाता है और हमेशा के लिए लटकता है।

उदाहरण के लिए यह लॉग इन कर सकता है -> गोटो प्रोफाइल -> पिछला हटाएं और फिर रुकें, या यह लॉगिन में ठीक से लटका सकता है। मैं उन चरणों पर बार-बार लूप करता हूं, और जितना अधिक मैं लूप करता हूं उतना ही अटक जाता है।

पहली लूप सफलता दर 90% दूसरी पाश लगभग 40% है। इसके अलावा Driver मैं इसका उपयोग भी प्रभावित करता हूं। यह HtmlUnitDriver के साथ लटकने की संभावना है और मैं वास्तव में HtmlUnitDrive का उपयोग करना चाहता हूं क्योंकि मैं उबंटू सर्वर पर अपना कोड हेडलेस चलाने के लिए चाहता हूं।

क्या किसी और को भी ऐसी ही समस्याएं थीं?

संपादित करें: अब कई घंटों के परीक्षण के बाद, मैंने देखा कि इसका केवल HtmlUnitDriver है जो फ़ायरफ़ॉक्स को लटकता है और नहीं। फ़ायरफ़ॉक्स का उपयोग करते समय मैं देख सकता हूं कि यह क्या कर रहा है और यह सबकुछ कर रहा है जैसा इसे करना चाहिए। समस्या HtmlUnitDriver के साथ होती है।

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.concurrent.TimeUnit; 
import org.junit.*; 
import static org.junit.Assert.*; 
import org.openqa.selenium.*; 
import org.openqa.selenium.htmlunit.HtmlUnitDriver; 

public class WebUpdater { 

    private WebDriver driver; 
    private String baseUrl; 
    private boolean acceptNextAlert = true; 
    private StringBuffer verificationErrors = new StringBuffer(); 

    @Before 
    public void setUp() throws Exception { 
     driver = new HtmlUnitDriver(true); // JavaScript enabled. 

     baseUrl = "http://exampleurl.com"; 
     driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
    } 

    @Test 
    public void testUnity() throws Exception { 
     openAndLogin(); 
     gotoProfile(); 
     deletePreviousPost(); 
     uploadPost(); 
     logOut(); 
     System.out.println("Done!"); 
    } 

    private void openAndLogin() { 
     driver.get(baseUrl); 

     driver.findElement(By.linkText("Login")).click(); 
     driver.findElement(By.id("jsid-login-id")).clear(); 
     driver.findElement(By.id("jsid-login-id")).sendKeys("[email protected]"); 
     driver.findElement(By.id("jsid-login-password")).clear(); 
     driver.findElement(By.id("jsid-login-password")).sendKeys("volume1991"); 
     driver.findElement(By.cssSelector("input.right")).click(); 

    } 

    private void gotoProfile() { 
     driver.findElement(By.cssSelector("img[alt=\"Profile\"]")).click(); 
    } 

    private void deletePreviousPost() { 
     try { 
      driver.findElement(By.cssSelector("img[alt=\"ExampleName\"]")).click(); 
      driver.findElement(By.linkText("Delete")).click(); 
      assertTrue(closeAlertAndGetItsText().matches("^Confirm to delete this post[\\s\\S]$")); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 

    private void uploadPost() { 
     driver.findElement(By.linkText("ExampleAction")).click(); 
     driver.findElement(By.id("example_url")).clear(); 
     driver.findElement(By.id("example_url")).sendKeys("Example text that gets typed in textfield."); 
     driver.findElement(By.cssSelector("input[name=\"example\"]")).clear(); 
     driver.findElement(By.cssSelector("input[name=\"example\"]")).sendKeys("ExampleName"); 
     driver.findElement(By.linkText("ExampleAction2")).click(); 
     System.out.println("Done"); 
    } 

    private void logOut() { 
     driver.get("http://exampleurl.com/logout"); 
     System.out.println("Logged out."); 
    } 

    @After 
    public void tearDown() throws Exception { 
     driver.quit(); 
     String verificationErrorString = verificationErrors.toString(); 
     if (!"".equals(verificationErrorString)) { 
      fail(verificationErrorString); 
     } 
    } 

    private boolean isElementPresent(By by) { 
     try { 
      driver.findElement(by); 
      return true; 
     } catch (NoSuchElementException e) { 
      return false; 
     } 
    } 

    private String closeAlertAndGetItsText() { 
     try { 
      Alert alert = driver.switchTo().alert(); 
      if (acceptNextAlert) { 
       alert.accept(); 
      } else { 
       alert.dismiss(); 
      } 
      return alert.getText(); 
     } finally { 
      acceptNextAlert = true; 
     } 
    } 
} 
अपने मुख्य वर्ग में

मैं इस तरह WebUpdater वर्ग फोन:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.logging.Level; 
import java.util.logging.Logger; 


public class Main { 

    public static void main(String[] args) { 

     Logger logger = Logger.getLogger(""); 
     logger.setLevel(Level.OFF); 

     scan(); 

    } 

    private static void scan() { 
     while (true) { 
      try { 
      // Test if connection is available and target url is up. 
       URL url = new URL("http://exampleurl.com"); 
       HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); 
       urlConn.connect(); 

      // Start tests. 
       WebUpdater updater = new WebUpdater(); 
       updater.setUp(); 
       updater.testUnity(); 
       updater.tearDown(); 
      } catch (Exception ex) { 
       System.out.println(ex); 
      } 
      try { 
       Thread.sleep(12000); 
      } catch (InterruptedException e) { 
      } 
     } 
    } 
} 
+0

आपका कोड ठीक दिखता है!मैं ['पृष्ठ लोड टाइमआउट()'] (http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html#pageLoadTimeout%28long,% आज़माउंगा 20java.util.concurrent.TimeUnit% 29) विधि (यदि यह काम करता है, तो यह कुछ संस्करणों में अधिकांश ब्राउज़रों में काम नहीं करता था)। मेरा अनुमान है कि लटका दिया गया स्थान यादृच्छिक है और इसमें कोई त्रुटि नहीं है, आपका पृष्ठ शायद लोड नहीं हुआ है और सेलेनियम सभी संपत्तियों को लोड करने के लिए प्रतीक्षा करता है। यहां तक ​​कि एक भी फ़ाइल छोड़ दी गई है, यह अभी भी ब्लॉक और प्रतीक्षा करेगा। जब लटका हुआ, फ़ायरफ़ॉक्स रिपोर्ट करता है कि पृष्ठ पूरी तरह से लोड हो गया है, या नहीं? –

+0

फ़ायरफ़ॉक्स अधिकांश समय एचटीएमएल यूनिट ड्रायवर काम करता है जो ज्यादातर समय लटकता है, और उसमें कोई जीयूआई नहीं है, इसलिए मुझे अपने सिस्टम पर प्रिंट पर भरोसा करना पड़ता है। क्या आपको पता है कि यह आमतौर पर ज्यादातर समय क्यों चलता है और बाद में रनों पर चलता है? –

+0

नोएडा। इसे डीबग करने का प्रयास करना एक अच्छा विचार हो सकता है और यह देख सकता है कि यह किस विधि में रुकता है और क्या यह हर बार एक ही विधि कॉल में बंद हो जाता है। वैसे, आप अपना 'urlConn' कभी बंद नहीं करते हैं। –

उत्तर

1

मैं HtmlUnitDriver साथ एक बुरा अनुभव था

और यहाँ कोड ही है। कुछ समय पहले मैंने परीक्षण ढांचे को लिखा था जिसे हडसन में निकाल दिया जाना था, और आखिरकार मैंने फ़ायरफ़ॉक्स ड्राइवर का उपयोग करने का फैसला किया जो डीबग करने के लिए अधिक अनुमानित और आसान था। मुद्दा यह है कि मेरे मामले में यह जावास्क्रिप्ट से भरा एक पृष्ठ था - गतिशील रूप से लोड किए गए फ़ील्ड इत्यादि, और HtmlUnitDriver के साथ काम करना वास्तव में कीड़े का एक कर था।

यदि आपको वास्तव में HtmlUnitDriver का उपयोग करने की आवश्यकता है तो 'पेजसोर्स' डीबग करने का प्रयास करें जो सेलेनियम के लिए 'वर्तमान' (फांसी) पल में पहुंच योग्य है।

1

HtmlUnit 2.11 त्रुटिपूर्ण (here और here देखें), और के बाद से HtmlUnit 2.12 लाइव मार्च के 6 वीं पास गया, HtmlUnitDriver के वर्तमान संस्करण शायद अभी भी HtmlUnit 2.11 पर आधारित है।

यदि आप अपना "http://exampleurl.com/" स्रोत कोड पोस्ट करते हैं (या केवल मुझे पृष्ठ पर एक वर्किंग यूआरएल दें यदि यह सार्वजनिक है) तो मैं पृष्ठ को HtmlUnit 2.12 के माध्यम से स्क्रिप्ट के साथ चला सकता हूं।