2013-03-02 16 views
6

Ich verwendete SeleniumHQ, um meine Aktionen aufzuzeichnen und dann zu Java Unity WebDrive exportiert. Dann bearbeitet ich exportierten Code und hinzugefügt viele kleine zusätzliche Dinge wie Schleifen über Array, Zeitstempel usw.Selenium HtmlUnitDriver hängt zufällig an zufälligen Orten

Mein Code ist folgende:

  1. Loggen Sie sich in meine Seite.
  2. Gehe zu meinem Profil.
  3. Löschen Sie meine vorherige Ankündigung.
  4. Neue Ankündigung veröffentlichen.
  5. Abmelden.

Ich habe versucht, FirefoxDriver und HtmlUnitDriver verwenden, aber jeder einzelne von ihnen gibt mir dieses seltsame Problem. Mein Code beginnt mit seiner Arbeit und hält zufällig an zufälliger Stelle und hängt dort für immer.

Zum Beispiel könnte es einloggen -> goto Profil -> löschen vorher und dann zu stoppen, oder es könnte rechts in der Anmeldung hängen. Ich wiederhole diese Schritte immer und immer wieder, und mehr schleife ich eher, dass es stecken bleibt.

Erste Schleifen Erfolgsquote ist 90% zweite Schleife ist um 40% usw. Auch die Driver ich auch diese betrifft. Es ist am wahrscheinlichsten, mit HtmlUnitDriver zu hängen, und ich würde wirklich HtmlUnitDrive verwenden wollen, weil ich meinen Code headless auf Ubuntu Server laufen lassen möchte.

Hat jemand anderes ähnliche Probleme?

EDIT: Jetzt nach vielen Stunden des Testens, bemerkte ich, dass es nur HtmlUnitDriver hängt und nicht Firefox. Wenn ich Firefox benutze, kann ich sehen, was es macht und es macht alles so wie es sollte. Problem tritt bei HtmlUnitDriver auf.

Und hier ist der Code selbst:

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; 
     } 
    } 
} 

in meinem Hauptklasse I WebUpdater Klasse wie folgt nennen:

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

Ihr Code sieht gut aus!Ich würde das ['pageLoadTimeout()'] versuchen (http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html#pageLoadTimeout%28long,% 20java.util.concurrent.TimeUnit% 29) Methode (wenn es funktioniert, hat es in den meisten Browsern vor einigen Versionen nicht funktioniert). Meine Vermutung ist, dass, da der Hang-Standort zufällig ist und kein Fehler ausgelöst wird, Ihre Seite wahrscheinlich nicht geladen ist und Selenium darauf wartet, dass alle Assets geladen werden. Wenn noch eine einzige Datei übrig ist, wird sie immer noch blockieren und warten. Wenn das Problem behoben ist, meldet Firefox, dass die Seite vollständig geladen ist oder nicht? –

+0

Firefox arbeitet die meiste Zeit mit seinem HtmlUnitDriver, der die meiste Zeit hängt, und da es keine GUI in diesem gibt, muss ich mich auf meine Systemausdrucke verlassen. Weißt du, warum es zuerst die meiste Zeit normal läuft und dann bei späteren Läufen aufhört? –

+0

Noidea. Es könnte eine gute Idee sein, zu versuchen, es zu debuggen und zu sehen, in welcher Methode es aufhört und ob es jedes Mal im selben Methodenaufruf stoppt. Übrigens schließt du niemals dein 'urlConn'. –

Antwort

1

ich mit HtmlUnitDriver schlechte Erfahrungen gemacht. Vor einiger Zeit schrieb ich Testrahmen, die auf Hudson gefeuert werden sollten, und schließlich entschied ich mich, den Firefox-Treiber zu verwenden, der berechenbarer und leichter zu debuggen war. Der Punkt ist, dass es in meinem Fall eine Seite voller Javascripte war - dynamisch geladene Felder, usw., und die Arbeit mit HtmlUnitDriver war wirklich eine Dose Würmer.

Wenn Sie wirklich HtmlUnitDriver verwenden müssen, versuchen Sie Debug "seitenquelle", die für Selenium in "aktuellen" (hängenden) Moment zugänglich ist.

1

HtmlUnit 2.11 ist fehlerhaft (siehe here und here), und da HtmlUnit 2.12 live März 6 ging, basiert die aktuelle Version von HtmlUnitDriver wahrscheinlich noch auf HtmlUnit 2.11.

Wenn Sie Ihren Quellcode "http://exampleurl.com/" veröffentlichen (oder mir einfach eine funktionierende URL zur Seite geben, wenn sie öffentlich ist), könnte ich die Seite mit Skripten über HtmlUnit 2.12 ausführen.

Verwandte Themen