Не удается извлечь атрибут из ответа HTML - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь извлечь атрибут из ответа html.

<html>
<head></head>
<body>
<script type="text/javascript" src="/sso/js/jquery/1/jquery.min.js?20190218"></script>
{serviceUrl: 'https://abcd/12345', serviceTicket: 'ABCD-123-1271821818sdsdbbsdgw3-pas'}
</body>
</html>

Ответ для веб-службы дает мне ответ html, из которого я хотел извлечь значение атрибута serviceUrl, но он дает мне нулевой указательисключениеВ приведенном ниже коде res является ответом html, хранящимся как String.

Response res =  given()
    .queryParam("logintoken", logintoken)
    .when()
    .get("/sso/login")
    .then().assertThat().statusCode(200).extract().response();

Document doc = Jsoup.parse(res.toString());
Element link = doc.select("script").first();
String serviceUrl = link.attr("serviceUrl");
System.out.println(serviceUrl);

Я ожидаю, что serviceUrl в последнем выражении вернет меня https://abcd/12345, но это исключение нулевого указателя

1 Ответ

0 голосов
/ 15 октября 2019

Чтобы получить полное тело ответа в виде строки, вам нужно использовать метод asString() вместо toString(). Вот пример:

Response response =  given()
    .queryParam("logintoken", logintoken)
    .when()
    .get("/sso/login")
    .then().assertThat().statusCode(200).extract().response();

//Extract response body as a string
String html = response.asString();

//Parse extracted html with Jsoup
Document document = Jsoup.parse(html);

//Get <body> element from html
Element body = document.body();

//Extract text from <body> element
String bodyText = body.ownText();

//Parse extracted text using Jackson's ObjectMapper
Map<String, Object> map = new HashMap<>();
ObjectMapper mapper = new ObjectMapper();

//Configure Jackson to work with unquoted fields and single quoted values
mapper.configure(Feature.ALLOW_SINGLE_QUOTES, true);
mapper.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);

try {
  map = mapper.readValue(String.valueOf(bodyText), new TypeReference<Map<String, Object>>() {});
} catch (Exception e) {
  e.printStackTrace();
}

System.out.println(map.get("serviceUrl"));

ObjectMapper Джексона использовался в примере выше для анализа текста из <body>. Подробнее об этом можно прочитать здесь - https://github.com/FasterXML/jackson-databind

...