2013-03-02 29 views
6

tôi đã sử dụng SeleniumHQ để ghi lại hành động của tôi và sau đó xuất khẩu chúng để Java Unity WebDrive. Sau đó, tôi thay đổi nội dung đang xuất khẩu và thêm nhiều thứ phụ nhỏ như vòng lặp qua mảng, thời gian tem vvSelenium HtmlUnitDriver treo một cách ngẫu nhiên ở những nơi ngẫu nhiên

Mã của tôi không sau:

  1. Đăng nhập vào trang web của tôi.
  2. Goto tiểu sử của tôi.
  3. Xóa thông báo trước của tôi.
  4. Đăng thông báo mới.
  5. Đăng xuất.

Tôi đã thử sử dụng FirefoxDriverHtmlUnitDriver, nhưng mỗi một trong số chúng mang lại cho tôi sự cố lạ này. Mã của tôi bắt đầu thực hiện công việc của mình và dừng ngẫu nhiên tại vị trí ngẫu nhiên và treo ở đó mãi mãi.

Ví dụ: nó có thể đăng nhập -> cấu hình goto -> xóa trước đó và sau đó dừng lại, hoặc nó có thể treo ngay trong đăng nhập. Tôi lặp lại các bước đó lặp đi lặp lại, và tôi lặp lại nhiều khả năng nó bị kẹt.

Tỷ lệ thành công vòng đầu tiên là vòng lặp thứ hai 90% là khoảng 40% vv. Ngoài ra, Driver tôi cũng sử dụng cũng ảnh hưởng đến điều này. Nó rất có thể treo với HtmlUnitDriver và tôi thực sự muốn sử dụng HtmlUnitDrive vì tôi muốn chạy mã của tôi không đầu trên Ubuntu Server.

Có ai khác có vấn đề tương tự không?

EDIT: Bây giờ sau nhiều giờ kiểm tra, tôi nhận thấy rằng chỉ HtmlUnitDriver bị treo và không phải Firefox. Khi sử dụng Firefox tôi có thể thấy nó đang làm gì và nó đang làm mọi thứ như nó cần. Sự cố xảy ra với HtmlUnitDriver.

Và đây là mã bản thân:

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

trong lớp học chính của tôi, tôi gọi lớp WebUpdater như thế này:

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

Mã của bạn có vẻ ổn!Tôi sẽ thử ['pageLoadTimeout()'] (http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html#pageLoadTimeout%28long,% 20java.util.concurrent.TimeUnit% 29) phương pháp (nếu nó hoạt động, nó đã không hoạt động trong hầu hết các trình duyệt một vài phiên bản trước đây). Đoán của tôi là cho rằng vị trí treo là ngẫu nhiên và không có lỗi ném, trang của bạn có lẽ không được tải và Selenium chờ đợi cho nó để tải tất cả các tài sản. Với ngay cả một tệp duy nhất còn lại, nó vẫn sẽ chặn và chờ. Khi treo, Firefox có báo cáo trang được tải hoàn toàn hay không? –

+0

Firefox hoạt động hầu hết thời gian HtmlUnitDriver của nó treo hầu hết thời gian và vì không có GUI trong đó tôi phải dựa vào hệ thống in của mình. Bạn có biết tại sao nó chạy đầu tiên chạy bình thường hầu hết thời gian và sau đó chạy sau dừng lại? –

+0

Noidea. Nó có thể là một ý tưởng tốt để cố gắng gỡ lỗi nó và xem trong đó phương pháp nào nó dừng lại và cho dù nó dừng lại trong cùng một phương pháp gọi mỗi lần. Nhân tiện, bạn không bao giờ đóng 'urlConn' của mình. –

Trả lời

1

Tôi đã có một kinh nghiệm xấu với HtmlUnitDriver. Một thời gian trước tôi đã viết thử nghiệm khuôn khổ được cho là sẽ được bắn tại Hudson, và cuối cùng tôi quyết định sử dụng trình điều khiển Firefox được nhiều hơn dự đoán và dễ dàng hơn để gỡ lỗi. Vấn đề là trong trường hợp của tôi đó là một trang đầy đủ các javascripts - các trường được nạp động, vv, và làm việc với HtmlUnitDriver thực sự là một khả năng của sâu.

Nếu bạn thực sự cần sử dụng HtmlUnitDriver, hãy thử gỡ lỗi 'pagesource' có thể truy cập được đối với Selenium trong thời điểm 'hiện tại' (treo).

1

HtmlUnit 2.11 là thiếu sót (xem herehere), và kể từ HtmlUnit 2.12 đã sống 06 Tháng 3, phiên bản hiện tại của HtmlUnitDriver có lẽ vẫn dựa trên HtmlUnit 2.11.

Nếu bạn đăng "http://exampleurl.com/" mã nguồn (hoặc chỉ cần cung cấp cho tôi một url hoạt động tới trang nếu nó công khai), tôi có thể chạy trang với các tập lệnh thông qua HtmlUnit 2.12.