Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Selenium HtmlUnitDriver在随机位置随机挂起_Java_Selenium_Htmlunit - Fatal编程技术网

Java Selenium HtmlUnitDriver在随机位置随机挂起

Java Selenium HtmlUnitDriver在随机位置随机挂起,java,selenium,htmlunit,Java,Selenium,Htmlunit,我使用SeleniumHQ记录我的操作,然后将它们导出到JavaUnityWebDrive。然后我编辑了导出的代码,并添加了许多额外的小东西,如数组循环、时间戳等 我的代码如下所示: 登录我的网站 转到我的个人资料 删除我以前的公告 发布新的公告 注销 我试过使用FirefoxDriver和HtmlUnitDriver,但每一个都给了我这个奇怪的问题。我的代码开始工作,并随机停止在随机点,永远挂在那里 例如,它可以登录->转到配置文件->删除上一个,然后停止,或者它可以在登录时挂起。我一遍又一遍

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

我的代码如下所示:

  • 登录我的网站
  • 转到我的个人资料
  • 删除我以前的公告
  • 发布新的公告
  • 注销
  • 我试过使用
    FirefoxDriver
    HtmlUnitDriver
    ,但每一个都给了我这个奇怪的问题。我的代码开始工作,并随机停止在随机点,永远挂在那里

    例如,它可以登录->转到配置文件->删除上一个,然后停止,或者它可以在登录时挂起。我一遍又一遍地重复这些步骤,越是重复,就越有可能被卡住

    第一次循环成功率为90%,第二次循环成功率约为40%,等等。我使用的
    驱动程序也会影响这一点。它很可能挂在
    HtmlUnitDriver
    上,我真的很想使用
    HtmlUnitDrive
    ,因为我想在Ubuntu服务器上无头运行我的代码

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

    EDIT:经过几个小时的测试,我发现只有
    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) {
                }
            }
        }
    }
    

    我和HtmlUnitDriver有过不愉快的经历。不久前,我编写了测试框架,该框架应该在Hudson上启动,最后我决定使用Firefox驱动程序,它更容易预测和调试。关键是,在我的例子中,这是一个充满Java脚本的页面——动态加载的字段等等,而使用HtmlUnitDriver真的是一堆蠕虫

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

    HtmlUnit 2.11有缺陷(请参阅和),自从HtmlUnit 2.12于3月6日上线以来,HtmlUnit驱动程序的当前版本可能仍然基于HtmlUnit 2.11


    如果你发布你的“”源代码(或者只要给我一个指向该页面的工作url,如果它是公共的),我可以通过HtmlUnit 2.12使用脚本运行该页面。

    你的代码看起来不错!我会尝试这种方法(如果它有效的话,几年前在大多数浏览器中都不起作用)。我的猜测是,假设挂起位置是随机的,并且没有抛出错误,您的页面可能没有加载,Selenium会等待它加载所有资产。即使只剩下一个文件,它仍然会阻塞并等待。挂起时,Firefox是否会报告页面已完全加载?Firefox的HtmlUnitDriver大部分时间都在工作,而HtmlUnitDriver大部分时间都挂起,由于该驱动程序中没有GUI,因此我必须依赖系统输出。你知道为什么它大部分时间第一次正常运行,然后在以后的运行中停止吗。试着调试它,看看它在哪个方法中停止,以及它是否每次都在同一个方法调用中停止,这可能是一个好主意。顺便说一句,你从来没有关闭过你的
    urlConn
    。我已经调试过了,当它停止时完全是随机的。感谢您指出urlConn,修复了它。甚至在内部?我的意思是-它可以是
    click()
    sendKeys()
    ,但在HtmlUnit内部,它仍然可以挂起在相同的方法中-如果您可以访问服务器,也就是说。这个问题是只发生在这个特定的页面上,还是也发生在其他页面上?