Selenium вызывает исключение на isTextPresent () на пользовательской странице ошибки - PullRequest
0 голосов
/ 21 марта 2011

В тесте на селен я открываю страницу, на которую у меня нет прав, и я хочу убедиться, что страница с ошибкой отображается вместо открытой.

Проверьте, проста ли эта страница ошибки:

Assert.assertTrue(selenium.isTextPresent("HTTP Status 403"));

Теперь я изменил страницу ошибки JBoss по умолчанию на пользовательскую, используя тег <error-page> в web.xml. После этого селен не работает. Выдает исключение из isTextPresent(). Конечно, текст на странице тоже изменился, но это не имеет значения.

Stacktrace - это:

com.thoughtworks.selenium.SeleniumException: ERROR: Command execution failure. Please search the forum at http://clearspace.openqa.org for error details from the log window.  The error message is: doc.style is undefined
at com.thoughtworks.selenium.HttpCommandProcessor.throwAssertionFailureExceptionOrError(HttpCommandProcessor.java:97)
at com.thoughtworks.selenium.HttpCommandProcessor.doCommand(HttpCommandProcessor.java:91)
at pl.softwaremill.common.test.web.selenium.screenshots.ScreenshotHttpCommandProcessor.doCommand(ScreenshotHttpCommandProcessor.java:31)
at com.thoughtworks.selenium.DefaultSelenium.captureEntirePageScreenshot(DefaultSelenium.java:679)
at pl.softwaremill.common.test.web.selenium.AbstractSeleniumTest.captureScreenshot(AbstractSeleniumTest.java:166)
at pl.softwaremill.common.test.web.selenium.AbstractSeleniumTest$1.doScreenshot(AbstractSeleniumTest.java:95)
... 27 more
com.thoughtworks.selenium.SeleniumException: ERROR: Couldn't access document.body.  Is this HTML page fully loaded?
at com.thoughtworks.selenium.HttpCommandProcessor.throwAssertionFailureExceptionOrError(HttpCommandProcessor.java:97)
at com.thoughtworks.selenium.HttpCommandProcessor.doCommand(HttpCommandProcessor.java:91)
at com.thoughtworks.selenium.HttpCommandProcessor.getString(HttpCommandProcessor.java:262)
at com.thoughtworks.selenium.HttpCommandProcessor.getBoolean(HttpCommandProcessor.java:335)
at pl.softwaremill.common.test.web.selenium.screenshots.ScreenshotHttpCommandProcessor.getBoolean(ScreenshotHttpCommandProcessor.java:92)
at com.thoughtworks.selenium.DefaultSelenium.isTextPresent(DefaultSelenium.java:499)
at za.co.fnb.commercial.dms.uitests.view.debtor.DebtorInsuranceAnnexurePage.<init>(DebtorInsuranceAnnexurePage.java:18)
at za.co.fnb.commercial.dms.uitests.view.debtor.UploadDebtorFilesPage.submit(UploadDebtorFilesPage.java:45)
at za.co.fnb.commercial.dms.uitests.view.debtor.UploadDebtorFilesSeleniumTest.shouldStoreFileEvenIfParseFails(UploadDebtorFilesSeleniumTest.java:145)

pl.softwaremill.common.test.web.selenium.screenshots.ScreenshotHttpCommandProcessor только делегаты работают на com.thoughtworks.selenium.HttpCommandProcessor

Потому что сообщение об ошибке говорит: «Эта HTML-страница полностью загружена?» Вы можете думать, что страница загружена не полностью, но это так. Я попробовал это в отладке, давая некоторое время для загрузки страницы, и она была загружена, но все же эта ошибка произошла.

1 Ответ

0 голосов
/ 09 мая 2014

На самом деле у меня такое же исключение, и я сначала ищу причину, отслеживаю трассировку стека и отлаживаю код селена. Это мое обучение;

Я использовал удаленный сервер селена

Версия Selenium:

 <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>2.39.0</version>
            <scope>test</scope>
        </dependency>

Это иерархия вызовов selenium.isTextPresent()

Иерархия вызовов

public boolean isTextPresent(String pattern) {
    return commandProcessor.getBoolean("isTextPresent", new String[] {pattern,});
  }

public boolean getBoolean(String commandName, String[] args) {
    String result = getString(commandName, args);
    ..........
..............
  }

 public String getString(String commandName, String[] args) {
    String result = doCommand(commandName, args);
    ..........
    ..............
  }
 public String doCommand(String commandName, String[] args) {
    DefaultRemoteCommand command = new DefaultRemoteCommand(commandName, args);
    String result = executeCommandOnServlet(command.getCommandURLString());
    ..........
   ..............
  }


/** Sends the specified command string to the bridge servlet */
  public String executeCommandOnServlet(String command) {
    try {
      return getCommandResponseAsString(command);
    } catch (IOException e) {
     ..........
       ..............
    }
  }

Мое понимание

Пока здесь не существует только фактический исполнитель иерархии вызововМетод getCommandResponseAsString(String command), поэтому трудно получить точный (на самом деле я имею в виду стабильный) результат отладки этого метода, потому что при проверке реализации кажется, что метод проверяет код ответа HttpURLConnection.HTTP_OK (его значение равно 200), если код ответавсе в порядке, он возвращает выполненную строку, но некоторые трудоемкие случаи это не так и бросить throwAssertionFailureExceptionOrError(uc.getResponseMessage());

Метод реализации

protected String getCommandResponseAsString(String command) throws IOException {
    String responseString = null;
    int responsecode = HttpURLConnection.HTTP_MOVED_PERM;
    HttpURLConnection uc = null;
    Writer wr = null;
    Reader rdr = null;
    while (responsecode == HttpURLConnection.HTTP_MOVED_PERM) {
      URL result = new URL(pathToServlet);
      String body = buildCommandBody(command);
      try {
        uc = getHttpUrlConnection(result);
        uc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
        uc.setInstanceFollowRedirects(false);
        uc.setDoOutput(true);
        wr = getOutputStreamWriter(uc);
        wr.write(body);
        wr.flush();
        responsecode = getResponseCode(uc);
        if (responsecode == HttpURLConnection.HTTP_MOVED_PERM) {
          pathToServlet = uc.getHeaderField("Location");
        } else if (responsecode != HttpURLConnection.HTTP_OK) {
          throwAssertionFailureExceptionOrError(uc.getResponseMessage());
        } else {
          rdr = getInputStreamReader(uc);
          responseString = stringContentsOfInputStream(rdr);
        }
      } finally {
        closeResources(uc, wr, rdr);
      }
    }
    return responseString;
  }

Грязное решение

Я пытаюсьобъясните причину выше, поэтому, пока я не найду идеальный способ, я продолжу свое тестирование с использованием метода Thread.sleep () или selenium.setSpeed ​​(1000) до использования метода selenium.isTextPresent ().

...