如何通过RestAssured测试登陆页面(跳转sso登陆,sso url携带新生成的login_challenge)
引入RestAssured和TestNG的依赖包,可以在pom.xml文件中添加以下依赖
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>4.3.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.14.1</version>
</dependency>
创建一个测试类,并在类上添加@Test注解
public class SSOLoginTest {
@Test
public void TestLogin{
}
}
在测试方法中,使用RestAssured发送GET请求到登陆页面,并获取响应
Response response = RestAssured.given()
.when()
.get("http://localhost:8080/login");
解析响应中的HTML页面,获取登陆页面中的表单数据,包括表单的action地址、hidden字段等信息
String html = response.getBody().asString();
Document document = Jsoup.parse(html);
Element form = document.select("form").first();
String action = form.attr("action");
Elements inputs = form.select("input");
Map<String, String> formData = new HashMap<>();
for (Element input : inputs) {
String name = input.attr("name");
String value = input.attr("value");
if (!name.isEmpty()) {
formData.put(name, value);
}
}
根据获取到的表单数据,构造POST请求,将用户名和密码作为参数发送到登陆页面
String username = "testuser";
String password = "testpassword";
formData.put("username", username);
formData.put("password", password);
response = RestAssured.given()
.contentType("application/x-www-form-urlencoded")
.formParams(formData)
.post(action);
解析响应中的HTML页面,获取跳转至SSO登陆页面的URL,该URL中包含了新生成的login_challenge参数
html = response.getBody().asString();
document = Jsoup.parse(html);
String ssoUrl = document.select("a").first().attr("href");
构造GET请求,将新生成的login_challenge参数作为参数发送到SSO登陆页面
response = RestAssured.given()
.when()
.get(ssoUrl);
根据响应中的状态码或者页面内容来判断登陆是否成功
Assert.assertEquals(response.getStatusCode(), 200);
Assert.assertTrue(response.getBody().asString().contains("Welcome"));
TODO(上述代码暂未PASS)