Проверка HTTP-кода состояния в Selenium
Как получить код состояния HTTP в Selenium?
Например, я могу проверить, что если браузер запрашивает /user/27 и не существует пользователя с ID=27, возвращается HTTP 404?
Мой основной интерес - Selenium RC, но если кто-то знает ответ на "нормальный" селен, я, вероятно, легко смогу перевести его на RC.
/Пит
7 ответов
Возможно, это не лучшее использование Selenium для этого типа теста. Нет необходимости загружать браузер, если вы можете сделать это и провести более быстрый тест
[Test]
[ExpectedException(typeof(WebException), UserMessage = "The remote server returned an error: (404) Not Found")]
public void ShouldThrowA404()
{
HttpWebRequest task; //For Calling the page
HttpWebResponse taskresponse = null; //Response returned
task = (HttpWebRequest)WebRequest.Create("http://foo.bar/thiswontexistevenifiwishedonedayitwould.html");
taskresponse = (HttpWebResponse)task.GetResponse();
}
Если ваш тест перенаправляет на другую страницу во время 404 Selenium, вы можете проверить, что на последней странице есть то, что вы ожидаете.
Я знаю, что это шокирующий хак, но вот что я сделал:
protected void AssertNotYellowScreen()
{
var selenium = Selenium;
if (selenium.GetBodyText().Contains("Server Error in '/' Application."))
{
string errorTitle = selenium.GetTitle();
Assert.Fail("Yellow Screen of Death: {0}", errorTitle);
}
}
Он выполняет свою работу в той ситуации, в которой я нуждался, хотя я признаю, что это не идеально...
Поскольку Selenium 2 включает HtmlUnit, вы можете использовать его для прямого доступа к ответу.
public static int getStatusCode(long appUserId) throws IOException {
WebClient webClient = new WebClient();
int code = webClient.getPage(
"http://your.url/123/"
).getWebResponse().getStatusCode();
webClient.closeAllWindows();
return code;
}
Вы, вероятно, хотите проверить вызов captureNetworkTraffic(). В настоящее время он надежно работает только с Firefox, если вы вручную не настроили IE/Safari/etc для прокси-трафика через порт 4444.
Чтобы использовать его, просто вызовите selenium.start("captureNetworkTraffic=true"), а затем в вашем скрипте вы можете вызвать selenium.captureNetworkTraffic("...") где "..." - "plain", "xml"или" JSON ".
Я не пробовал, но если вы не возражаете ограничиться Firefox и установить Firebug и Netexport, то Selenium может получить доступ к коду состояния страницы (и всему остальному на панели Net в Firebug): http: // selenium.polteq.com / о / с использованием-netexport к экспортно-поджигателям-нетто-панель /
Попробуй это, люди
WebClient wc = new WebClient();
int countRepeats = 120; // one wait = 0.5 sec, total 1 minute after this code
boolean haveResult = false;
try {
HtmlPage pageHndl = wc.getPage(Urls);
for(int iter=0; iter<countRepeats; iter++){
int pageCode = pageHndl.getWebResponse().getStatusCode();
System.out.println("Page status "+pageCode);
if(pageCode == 200){
haveResult = true;
break;
}
else{
Thread.sleep(500);
}
}
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (InterruptedException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
Если ничего не помогает, вы можете адаптировать свой код на стороне сервера во время тестирования, чтобы выводить статус HTTP на странице как элемент:
Например, на моей странице 403 Permission Denied у меня есть:
<h1 id="web_403">403 Access Denied</h1>
который можно легко проверить с помощью API WebDriver:
public boolean is403(WebDriver driver) {
try {
driver.findElement(By.id("web_403"));
return true;
} catch (NoSuchElementException e) {
return false;
}
}
http://www.ninthavenue.com.au/how-to-get-the-http-status-code-in-selenium-webdriver