Selenium HtmlUnitDriver在随机位置随机挂起

时间:2013-03-02 22:45:36

标签: java selenium htmlunit

我使用 SeleniumHQ 记录我的操作,然后将其导出到 Java Unity WebDrive 。然后我编辑了导出的代码并添加了许多额外的东西,比如循环数组,时间戳等等。

我的代码确实如下:

  1. 登录我的网站。
  2. 转到我的个人资料。
  3. 删除我之前的公告。
  4. 发布新公告。
  5. 退出。
  6. 我尝试过使用FirefoxDriverHtmlUnitDriver,但是每一个都给了我这个奇怪的问题。我的代码开始做它的工作并随机停留在随机点并永远挂在那里。

    例如,它可以登录 - >转到个人资料 - >删除之前然后停止,或者它可以在登录中挂起。我一遍又一遍地循环这些步骤,更多的循环更可能是卡住了。

    第一次循环成功率为90%,第二次循环约为40%等。我使用的Driver也会影响这一点。它最有可能与HtmlUnitDriver挂起,我真的想使用HtmlUnitDrive,因为我想在Ubuntu Server上运行我的代码。

    还有其他人有过类似的问题吗?

    编辑:现在经过数小时的测试后,我发现只有HtmlUnitDriver挂起而不是Firefox。使用Firefox时,我可以看到它正在做什么,它正在做所有应有的事情。 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("bilgeis.babayan@gmail.com");
            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) {
                }
            }
        }
    }
    

2 个答案:

答案 0 :(得分:1)

我对HtmlUnitDriver的体验很糟糕。前段时间我编写了测试框架,应该在Hudson上解雇,最后我决定使用Firefox驱动程序,它更易于预测,更容易调试。关键是在我的情况下,它是一个充满javascripts的页面 - 动态加载的字段等,并且使用HtmlUnitDriver实际上是一堆蠕虫。

如果你真的需要使用HtmlUnitDriver,请尝试调试'pagesource',这可以在'当前'(挂起)时刻访问Selenium。

答案 1 :(得分:1)

HtmlUnit 2.11存在缺陷(请参阅herehere),并且由于HtmlUnit 2.12于6月6日上线,因此当前版本的HtmlUnitDriver可能仍然基于HtmlUnit 2.11。

如果你发布了你的“http://exampleurl.com/”源代码(或者只是给我一个工作网址,如果它是公开的)我可以通过HtmlUnit 2.12运行带有脚本的页面。