6

SeleniumHQを使用してアクションを記録し、 JavaUnityWebDriveにエクスポートしました。次に、エクスポートされたコードを編集し、配列のループ、タイムスタンプなどの小さな追加機能を多数追加しました。

私のコードは次のようになります:

  1. 私のサイトにログインします。
  2. 私のプロフィールに移動します。
  3. 以前のアナウンスを削除します。
  4. 新しい発表を投稿します。
  5. ログアウト。

FirefoxDriverとを使ってみHtmlUnitDriverましたが、どれもこの奇妙な問題を引き起こします。私のコードはその作業を開始し、ランダムな場所でランダムに停止し、そこで永遠にハングします。

たとえば、ログイン->プロファイルに移動->前を削除してから停止するか、ログインですぐにハングする可能性があります。私はそれらのステップを何度も繰り返しループしますが、ループするほど、スタックする可能性が高くなります。

最初のループの成功率は90%です。2番目のループは約40%などDriverです。これも私が使用しているものに影響します。Ubuntu Serverでコードをヘッドレスで実行したいので、ハングアップする可能性が最も高く、HtmlUnitDriver本当に使用したいと思います。HtmlUnitDrive

他の誰かが同様の問題を抱えていましたか?

編集:HtmlUnitDriver何時間もテストした後、 Firefoxではなくそれだけがハングすることに気づきました。Firefoxを使用しているとき、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 を使用する必要がある場合は、'current' (ハング) の瞬間に 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 に答える