Selenium登录网站的多种实现手段

文章目录

  • 用 WebDriver 点击 UI 实现登陆
  • 用 HttpClient 模拟接口进行登录
  • 直接手动抓登录信息写在项目中
  • 用复用浏览器 getCookie 来登录
  • 其他

Selenium登录网站的多种实现手段_第1张图片

用 WebDriver 点击 UI 实现登陆

这一种是最常规的方式,就是直接使用 WebDriver 点击 UI 界面实现登陆操作,基本上绝大部分的 WebUI 测试项目用这种方式都是足够了

适合的登录页:

  • 常规的没有任何验证码,没有滑块,不用扫二维码的登录页面
  • 适合有滑块的登录页面
  • 对于有比较规范的验证码的登录页面,可以尝试集成图像识别来解决

用 HttpClient 模拟接口进行登录

这一种方式算是对 UI 登录的一种优化,如果觉得 UI 失误率高,比较费时,可以使用 HttpClient 进行接口模拟登录

适合的登录页:

  • 常规的没有任何验证码,没有滑块,不用扫二维码的登录页面
  • 对于有验证码的登录页面,可以与开发沟通开放一个拿验证码的接口,然后通过接口模拟登录

当我们 HttpClient 访问登录的接口后,通过抓取响应体中的 token 信息,然后 addcookies 或者保存进 localstorage 或者 sessionstorage 来实现登录(具体要看保存到哪里才正确),我们可以在每个测试的地方都可以用 HttpClient 进行登录,或者通过文件流的方式,第一次接口登陆后拿到了响应数据中的登录信息,直接保存进文件,以后从文件中拿即可

这里提供一个小的模板 demo

// 先进入到要登陆的页面
driver.get("https://要登录的页面");

// post 请求登录的接口
HttpPost httpPost = new HttpPost("https://登录的接口");

// 设置 post 请求的超时时间
RequestConfig config = RequestConfig.custom().setConnectTimeout(5000).setConnectionRequestTimeout(5000).setSocketTimeout(5000).setRedirectsEnabled(true).build();
httpPost.setConfig(config);

// 设置请求头
httpPost.setHeader("键", "值");
httpPost.setHeader("键", "值");
[...]

// 设置请求传参(以 form-data 类型参数举例)
List<BasicNameValuePair> pair = new ArrayList<>();
pair.add(new BasicNameValuePair("username", "用户名"));
pair.add(new BasicNameValuePair("password", "密码"));
[...]
httpPost.setEntity(new UrlEncodedFormEntity(pair));

// 执行请求并拿到响应数据
CloseableHttpClient HttpClient = HttpClients.createDefault();
HttpResponse httpResponse = httpClient.execute(httpPost);

// 拿到状态码
int statusCode = httpResponse.getStatusLine().getStatusCode();

// 拿到响应体数据
String resultStr = EntityUtils.toString(httpResponse.getEntity());

// 可以通过 JsonObject 进行转化再取数据
JSONObject resultJson = JSONObject.fromObject(resultStr);
String token = resultJson.get("键").toString();
[...]

直接手动抓登录信息写在项目中

这一种方式是登录页面后,我们打开谷歌调试在 application 页面去抓登录信息,具体登录需要哪些字段,可以去问开发或者自己尝试。下图中我红框框住的地方是登录信息会存储的地方

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qvek54F3-1591967517174)(C:\Users\石磊\AppData\Roaming\Typora\typora-user-images\1591965935617.png)]

我以前做的项目有的是把登录信息存在 cookies 中,有的则可能存在 localstorage 中,具体我们可以去查看

适合的页面:

  • 常规的没有任何验证码,没有滑块,不用扫二维码的登录页面
  • 有滑块的页面
  • 有验证码的页面
  • 有二维码登录的页面

然后我们如何在 WebUI 测试项目中保存他们呢?我们可以通过 Selenium 提供的 JavascriptExecutor 这个类来操作执行 js 代码来保存数据,我们都知道 js 可以操纵前端浏览器

JavascriptExecutor je = (JavascriptExecutor)driver;

那需要怎么执行 js 呢?

// 存储 localstorage
window.localStorage.setItem('token', 'xxx')

// 存储 sessionstorage
window.sessionStorage.setItem('token', 'xxx')

// 存储 cookies(添加)
document.cookie='username=Zhang San'

另外 cookies 保存还可以通过 selenium 的接口来实现

driver.manage().addCookie("username", "Zhang San");
[...]

用复用浏览器 getCookie 来登录

复用浏览器一般做调试使用,对于有的项目的页面不太好进入,手动方便进入一些,这个时候可以使用复用浏览器来调试,然后我们可以通过 selenium 的getCookies 方法拿到 cookies

适合的页面:

  • 常规的没有任何验证码,没有滑块,不用扫二维码的登录页面

  • 有滑块的页面

  • 有验证码的页面

  • 有二维码登录的页面(对于只能用二维码登录的界面,最好使用这种办法)

具体如何去做呢?

我们先使用复用浏览器进行调试,如何使用复用浏览器调试请参见我的另一篇专门讲复用浏览器调试的文章。我们运行下面的代码目的是保存 cookies 到一个文件中,文件路径随便定,其实本质上就是文件流操作

// 文件写入流
FileWriter fileWriter = new FileWriter("相对于项目的路径/cookies.txt");
// 文件写入缓冲流
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
// 通过 selenium 的接口拿到当前页面的 cookies
for (Cookie cookie : driver.manage().getCookies()) {
    // 写入用分号分隔
    bufferedWriter.write(cookie.getName() + ";" +cookie.getValue());
    // 加一空行
    bufferedWriter.newLine();
}
// 关闭写入流
bufferedWriter.close();

复用浏览器写入结束,我们写一个真实测试用例来尝试从文件中读取 cookies 来登录

[driver.get(...)先要进入那个页面才行]

// 文件读出流
FileReader fileReader = new FileReader("相对于项目的路径/cookies.txt");
// 文件读出缓冲流
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line;
// 循环读文件中的每一行
while ((line = bufferedReader.readLine()) != null) {
    // 字符串分割器
    StringTokenizer stringTokenizer = new StringTokenizer(line, ";");
    String name = stringTokenizer.nextToken();
    String value = stringTokenizer.nextToken();
    // 存入 cookie
    Cookie cookie = new Cookie(name, value);
    driver.manage().addCookie(cookie);
}

[driver.get(...)最后还要再次进入那个页面]

其他

对于有登录页面,你不想用 cookies 来登录,然而开发又不愿意开发验证码的接口,对于邮箱收到验证码的,你可以通过 UI 或者接口形式访问邮箱也是一种可行的选择


广告

150讲轻松搞定Python网络爬虫

你可能感兴趣的:(Selenium)