gpt4 book ai didi

java - Selenium HtmlUnitDriver 在随机位置随机挂起

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:29:42 29 4
gpt4 key购买 nike

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

我的代码执行以下操作:

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

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

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

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

有没有人遇到过类似的问题?

编辑: 经过数小时的测试后,我注意到挂起的只是 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 驱动程序,它更可预测,更容易调试。关键是,在我的例子中,它是一个充满 javascript 的页面——动态加载的字段等,使用 HtmlUnitDriver 确实是一堆蠕虫。

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

关于java - Selenium HtmlUnitDriver 在随机位置随机挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15180326/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com