Selenium自动化测试 -复用浏览器+Cookies复用

文章目录

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。



本文开始

浏览器复用

1. 复用浏览器作用

复用浏览器好处:

1.自动化测试过程中,需要人为介入场景

如:人为扫描登录等情况

2.提高调试 UI 自动化测试脚本效率

如:可以复用浏览器,再已经登录的页面进行自动化操作

2. 复用已有浏览器-配置步骤

  1. 需要退出当前所有的谷歌浏览器(特别注意)
    包括后台进程中的都需要查看-win环境
  2. 输入启动命令,通过命令启动谷歌浏览器
    前提配置:
    a. 找到 chrome 的启动路径(下一页 ppt)s
    b. 配置环境变量(下一页 ppt)
  3. 验证是否启动成功

启动命令:

windows:

bash 复制代码
chrome --remote-debugging-port=9222

mac:

bash 复制代码
Google\ Chrome --remote-debugging-port=9222

【注】想要代码中复用浏览器,必须先启动浏览器

验证启动成功命令

浏览器输入:localhost:9222

如果页面显示空白,不是错误提示,代表启动成功;

浏览器环境变量配置

windows 环境变量配置:
  1. 获取chrome启动路径
  2. 配置环境变量-将chrome浏览器路径配置到系统环境变量中(win-path路径中)
  3. 重启命令行,执行命令验证(也就是执行-chrome --remote-debugging-port=9222)

【注】前提-win 需要关闭谷歌浏览器全部进程

Mac 环境变量配置

1.获取启动路径(注意:使用 tab 键,不要手动输入)

2.将启动路径配置到环境变量中

bash 复制代码
export PATH=$PATH:/Applications/Google\ Chrome.app/Contents/MacOS

复用浏览器适用场景

场景 1:

企业微信登录无法通过输入用户名密码的方式解决登录问题,后面所有的脚本都无法执行。

解决方案:

通过 remote 复用浏览器人工登录企业微信,不用多次登录,后面的脚本自动执行。

场景 2:

编写自动化测试脚本过程中,用例的某一步骤出现问题。调试时需要将此步骤前面所有的步骤执行完成之后再复现调试。

解决方案:

使用复用浏览器的方式,使浏览器到执行的某个步骤(跳过前面的自动化执行步骤),轻松复现出问题的场景,只对问题行代码进行调试(不用重复登录等过程);

3. 代码中复用已有浏览器

python代码中配置:

【注】前提:需要命令行执行浏览器启动命令,再在代码中使用命令,不然不生效代码;

python 复制代码
from selenium.webdriver.chrome.options import Options
option = Options()
option.debugger_address = "localhost:9222"
self._driver = webdriver.Chrome(options=option)
self._driver.get("https://work.weixin.qq.com/wework_admin/frame")

java代码中配置

【注】前提:需要命令行执行浏览器启动命令,再在代码中使用命令,不然不生效代码;

java 复制代码
public class RemoteTest {
    @Test
    void remoteLogin(){
        // 1.设置chromeOptions实例对象
        ChromeOptions chromeOptions = new ChromeOptions();
        // 2.配置debug地址
        chromeOptions.setExperimentalOption("debuggerAddress","localhost:9222");
        // 3.初始化浏览器并添加配置信息
        WebDriver driver = new ChromeDriver(chromeOptions);
        driver.get("https://baidu.com/");
    }
}

2. Cookie的复用

Cookie 是一些认证数据信息,存储在电脑的浏览器上,每次请求会带上Cookie信息,服务器会验证相遇Cookie;

使用Cookie自动化登录的理由

  • 复用浏览器仍然在每次用例开始都需要人为介入
  • 若用例需要经常执行,复用浏览器则不是一个好的选择
  • 大部分cookie的时效性都很长,扫一次可以使用多次

Cookie复用流程

添加前置依赖

yaml 复制代码
<properties>
  <!--对应解析-->
  <jackson.version>2.13.1</jackson.version>
</properties>

<dependencies>
  <!--yaml文件解析-->
  <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>${jackson.version}</version>
  </dependency>
  <dependency>
      <groupId>com.fasterxml.jackson.dataformat</groupId>
      <artifactId>jackson-dataformat-yaml</artifactId>
      <version>${jackson.version}</version>
  </dependency>
</dependencies>

Java代码实现Cookie复用

核心:

获取 cookie driver.manage().getCookies();

添加 cookie driver.manage().addCookie()

java 复制代码
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.io.File;
import java.io.IOException;
import java.time.Duration;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import static java.lang.Thread.sleep;

public class CookieTest {
    private static ChromeDriver driver;
    private static WebDriverWait wait;
    final ObjectMapper mapper = new ObjectMapper(new YAMLFactory());

    @BeforeAll
    static void setupClass(){
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        driver = new ChromeDriver(options);
        wait = new WebDriverWait(driver,Duration.ofSeconds(30));
    }

    @AfterAll
    static void afterAll() throws InterruptedException {
        Thread.sleep(10000);
        driver.quit();
    }
    // Cookie读取的步骤
    @Test
    public void saveCookies() throws IOException {
        // 1. 访问企业微信登陆页面
        driver.get("https://work.weixin.qq.com/wework_admin/loginpage_wx");
        // 2. 手动扫码登录,确定成功跳转页面
        // 3. 显式等待判断当前的url不等于前面获取的url
        // wait.until(webDriver -> !webDriver.getCurrentUrl().equals(url));
		//验证页面url包含路径xxx
        wait.until(ExpectedConditions.urlContains("https://work.weixin.qq.com/wework_admin/frame"));

        // 4. 登录成功后获取当前的cookie信息
        Set<Cookie> cookies = driver.manage().getCookies();
        // 5. 将获取的Cookie写入cookie文件
        mapper.writeValue(new File("cookies.yaml"), cookies);
    }
    // Cookie写入的步骤
    @Test
    void loadCookies() throws IOException {
        //1.访问企业微信登陆页面
        driver.get("https://work.weixin.qq.com/wework_admin/loginpage_wx");
        //2.从yaml文件读取cookies信息
        TypeReference<List<HashMap<String,Object>>> typeRef = new TypeReference<>(){};
        List<HashMap<String, Object>> cookies = mapper.readValue(new File("cookies.yaml"), typeRef);
        //3.将cookies信息使用add方法添加到浏览器中
        cookies.stream().forEach(cookie -> {
            driver.manage().addCookie(new Cookie(
                    cookie.get("name").toString(),
                    cookie.get("value").toString()
            ));
        });
        //4.刷新页面
        driver.navigate().refresh();
    }

【注】如果存储的 Cookie 来自多个不同网站,而只想恢复特定网站(如企业微信)的登录状态时使用。

java 复制代码
// 使用过滤
.filter(cookie -> cookie.get("domain").toString().
                contains("work.weixin.qq.com"))

总结

✨✨✨各位读友,本篇分享到内容是否更好的帮助你理解,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
🎉🎉🎉一遇挫折就灰心丧气的人,永远是个失败者。而一向努力奋斗,坚韧不拔的人会走向成功。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

相关推荐
英英_2 小时前
Selenium 模拟浏览器教程:搞定动态页面爬虫
爬虫·selenium·测试工具
英英_3 小时前
Selenium 常用浏览器操作全解析
python·selenium·测试工具
tinygone4 小时前
使用OpenClaw读取和生成PPT
经验分享·powerpoint
智者知已应修善业4 小时前
【任何一个自然数m的立方均可写成m个连续奇数之和】2024-10-17
c语言·数据结构·c++·经验分享·笔记·算法
YYYing.4 小时前
【Linux/C++多线程篇(二) 】给线程装上“红绿灯”:通俗易懂的同步互斥机制讲解 & C++ 11下的多线程
linux·c语言·c++·经验分享·ubuntu
Xi-Xu5 小时前
低成本运行 Claude Code:通过 LiteLLM 接入 GitHub Copilot Chat API 的完整指南
人工智能·经验分享·github·copilot·生产力工具
一个人旅程~5 小时前
Dram短缺如何影响PC和笔记本市场?
windows·经验分享·aigc·电脑
我说的工具是好用的5 小时前
抖音视频下载方法汇总:5款工具实测体验
学习·测试工具·音视频
一个人旅程~6 小时前
win11的ARM版本上能运行X86X64软件吗?哪些软件会存在故障?
windows·经验分享·电脑