użyłem SeleniumHQ nagrać moje działania, a następnie wywożone im Java Unity WebDrive. Potem edytować kod eksportowany i dodano wiele małych dodatkowych rzeczy jak zapętlenie nad tablicę, znaczniki czasu itdSelen HtmlUnitDriver zawiesza się losowo w przypadkowych miejscach
Mój kod jest następujący:
- zalogować się na mojej stronie.
- Przejdź do mojego profilu.
- Usuń moje poprzednie ogłoszenie.
- Napisz nowe ogłoszenie.
- Wyloguj się.
Próbowałem używać FirefoxDriver
i HtmlUnitDriver
, ale każdy z nich daje mi ten dziwny problem. Mój kod zaczyna działać i losowo zatrzymuje się w przypadkowym miejscu i zawiesza się tam na zawsze.
Na przykład może zalogować się -> profil goto -> usunąć poprzedni, a następnie zatrzymać, lub może zawiesić się w logowaniu. Pętla po tych krokach w kółko, i więcej pętli bardziej prawdopodobne, że utknie.
Szybkość udanych pierwszych pętli wynosi 90%, druga pętla to około 40% itd. Również to, którego używam, również ma wpływ na to. Najprawdopodobniej zawiedzie się z HtmlUnitDriver
i naprawdę chciałbym użyć HtmlUnitDrive
, ponieważ chcę uruchomić mój kod bez głowy na serwerze Ubuntu.
Czy ktoś jeszcze miał podobne problemy?
EDIT: Teraz po wielu godzinach testów zauważyłem, że jego jedyną HtmlUnitDriver
że wisi, a nie Firefox. Korzystając z Firefoksa widzę, co robi i robi wszystko tak, jak powinno. Problem występuje z HtmlUnitDriver
.
A oto kod sama:
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("[email protected]");
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;
}
}
}
w moim głównym klasy wzywam klasa WebUpdater tak:
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) {
}
}
}
}
Twój kod wygląda dobrze!Spróbowałbym ['pageLoadTimeout()'] (http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html#pageLoadTimeout%28long,% 20java.util.concurrent.TimeUnit% 29) (jeśli działa, to nie działało w większości przeglądarek kilka wersji wcześniej). Domyślam się, że biorąc pod uwagę, że hang-location jest losowa i nie ma żadnego błędu, twoja strona prawdopodobnie nie jest załadowana, a Selenium czeka na załadowanie wszystkich zasobów. Nawet po zostawieniu jednego pliku nadal będzie blokował i czekał. Po zawieszeniu Firefox zgłasza, że strona jest całkowicie załadowana, czy nie? –
Firefox pracuje przez większość czasu w swoim HtmlUnitDriver, który zawiesza się przez większość czasu, a ponieważ nie ma tam GUI, muszę polegać na wydrukach mojego systemu. Czy wiesz, dlaczego uruchamia się normalnie przez większość czasu, a potem na późniejszych odcinkach? –
Noidea. Dobrym pomysłem może być próba debugowania i sprawdzenia, która metoda zatrzymuje się i czy zatrzymuje się w tym samym wywołaniu metody za każdym razem. Przy okazji, nigdy nie zamykaj 'urlConn'. –