6

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

我的代码执行以下操作:

  1. 登录我的网站。
  2. 转到我的个人资料。
  3. 删除我之前的公告。
  4. 发布新公告。
  5. 登出。

我尝试过使用FirefoxDriverand HtmlUnitDriver,但是它们中的每一个都给了我这个奇怪的问题。我的代码开始工作并随机停在随机位置并永远挂在那里。

例如,它可以登录 -> 转到配置文件 -> 删除上一个然后停止,或者它可以直接挂在登录中。我一遍又一遍地循环这些步骤,我循环越多,就越有可能卡住。

第一个循环成功率为 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) {
            }
        }
    }
}
4

2 回答 2

1

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

如果您确实需要使用 HtmlUnitDriver,请尝试在“当前”(挂起)时刻调试 Selenium 可访问的“pagesource”。

于 2013-03-09T17:57:44.790 回答
1

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

如果您发布您的“ http://exampleurl.com/ ”源代码(或者如果它是公开的,则只给我一个该页面的工作 url)我可以通过 HtmlUnit 2.12 使用脚本运行该页面。

于 2013-03-11T23:07:11.677 回答