2013-03-02 16 views
6

użyłem SeleniumHQ nagrać moje działania, a następnie wywożone im Java Unity WebDrive. Potem edytować kod eksportowany i dodano wiele małych dodatkowych rzeczy jak zapętlenie nad tablicę, znaczniki czasu itdSelen HtmlUnitDriver zawiesza się losowo w przypadkowych miejscach

Mój kod jest następujący:

  1. zalogować się na mojej stronie.
  2. Przejdź do mojego profilu.
  3. Usuń moje poprzednie ogłoszenie.
  4. Napisz nowe ogłoszenie.
  5. Wyloguj się.

Próbowałem używać FirefoxDriver i HtmlUnitDriver, ale każdy z nich daje mi ten dziwny problem. Mój kod zaczyna działać i losowo zatrzymuje się w przypadkowym miejscu i zawiesza się tam na zawsze.

Na przykład może zalogować się -> profil goto -> usunąć poprzedni, a następnie zatrzymać, lub może zawiesić się w logowaniu. Pętla po tych krokach w kółko, i więcej pętli bardziej prawdopodobne, że utknie.

Szybkość udanych pierwszych pętli wynosi 90%, druga pętla to około 40% itd. Również to, którego używam, również ma wpływ na to. Najprawdopodobniej zawiedzie się z HtmlUnitDriver i naprawdę chciałbym użyć HtmlUnitDrive, ponieważ chcę uruchomić mój kod bez głowy na serwerze Ubuntu.

Czy ktoś jeszcze miał podobne problemy?

EDIT: Teraz po wielu godzinach testów zauważyłem, że jego jedyną HtmlUnitDriver że wisi, a nie Firefox. Korzystając z Firefoksa widzę, co robi i robi wszystko tak, jak powinno. Problem występuje z HtmlUnitDriver.

A oto kod sama:

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

w moim głównym klasy wzywam klasa WebUpdater tak:

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

Twój kod wygląda dobrze!Spróbowałbym ['pageLoadTimeout()'] (http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html#pageLoadTimeout%28long,% 20java.util.concurrent.TimeUnit% 29) (jeśli działa, to nie działało w większości przeglądarek kilka wersji wcześniej). Domyślam się, że biorąc pod uwagę, że hang-location jest losowa i nie ma żadnego błędu, twoja strona prawdopodobnie nie jest załadowana, a Selenium czeka na załadowanie wszystkich zasobów. Nawet po zostawieniu jednego pliku nadal będzie blokował i czekał. Po zawieszeniu Firefox zgłasza, że ​​strona jest całkowicie załadowana, czy nie? –

+0

Firefox pracuje przez większość czasu w swoim HtmlUnitDriver, który zawiesza się przez większość czasu, a ponieważ nie ma tam GUI, muszę polegać na wydrukach mojego systemu. Czy wiesz, dlaczego uruchamia się normalnie przez większość czasu, a potem na późniejszych odcinkach? –

+0

Noidea. Dobrym pomysłem może być próba debugowania i sprawdzenia, która metoda zatrzymuje się i czy zatrzymuje się w tym samym wywołaniu metody za każdym razem. Przy okazji, nigdy nie zamykaj 'urlConn'. –

Odpowiedz

1

miałem złe doświadczenia z HtmlUnitDriver. Jakiś czas temu napisałem framework testowy, który miał zostać uruchomiony w Hudson, i ostatecznie zdecydowałem się na użycie sterownika Firefox, który był bardziej przewidywalny i łatwiejszy do debugowania. Chodzi o to, że w moim przypadku była to strona pełna javascriptów - dynamicznie ładowanych pól itp., A praca z HtmlUnitDriver była naprawdę puszką robaków.

Jeśli naprawdę potrzebujesz użyć HtmlUnitDriver, spróbuj wykonać debugowanie 'pagesource' dostępnego dla Selenium w 'bieżącym' (wiszącym) momencie.

1

HtmlUnit 2.11 jest wadliwy (patrz here i here), a od HtmlUnit 2,12 poszedł na żywo 6 marca, obecna wersja HtmlUnitDriver jest prawdopodobnie nadal opiera się na HtmlUnit 2,11.

Jeśli opublikujesz swój kod źródłowy "http://exampleurl.com/" (lub podasz mi działający URL do strony, jeśli jest publiczny), mogę uruchomić stronę ze skryptami za pomocą HtmlUnit 2.12.

Powiązane problemy