java - 从一个 Selenium session 到另一个 Selenium session 长期保存 Cookie 的最佳方法?

标签 java selenium selenium-webdriver firefox cookies

我正在使用 Selenium WebDriver 启动特定的 Firefox 配置文件。通常,Selenium 会创建一个 FF 的临时安装,模拟现有的 Firefox 配置文件,然后在调用 webdriver.close() 后将其删除。

但是,我需要能够通过 Selenium 启动 Firefox WebDriver 并为以后的 session 保留某些登录 cookie,这样我就不会被要求输入密码和/或每次登录帐户时的验证码。我已经看到了几种解决此问题的方法,但每种方法都有其自身的问题:

1) 识别Selenium创建的临时文件,将cookies.sqlite复制到原FF Profile安装文件夹。我用这种方法看到的问题是我同时启动了许多 Selenium 实例,那么我如何确定哪个临时文件夹对应于特定的 WebDriver session ?另外,是否可以将 cookie 附加到原始安装文件而不是覆盖原始文件?

2)一个user suggested调用:

Set<Cookie> allCookies = driver.manage().getCookies();

在调用 driver.close() 之前,然后通过调用将 cookie 添加到下一个 WebDriver session :

for(Cookie cookie : allCookies)
{
    driver.manage().addCookie(cookie);
}

我看到这种方法的问题是我需要长期(即永远)保留 cookie,而且我无法将所有 session 的 cookie 存储在内存中。即使我可以,当程序存在或主机关闭时,cookie 数据也会丢失。此外,getCookies() 仅返回当前域的 cookie,而 addCookie() 仅允许添加域与当前 URL 域相同的 cookie。因此,在获取或设置 cookie 时,重要的是首先转到正确的 URL,正如指出的那样 by one commenter .我想在启动新的 FF session 时立即从多个域加载 cookie。

3) 另一种选择可能是首先阻止 Firefox 在新位置创建临时文件(即重定向到原始 FF 安装目录)并防止 FF 在退出时删除临时文件.这样的东西可行吗?

我见过一些其他方法,但它们要么只解决与 Chrome(而非 Firefox)或 Python 相关的问题,要么存在上述缺陷之一。

在Java + Firefox中可以使用什么方法来解决这个问题?

谢谢!

最佳答案

最适合您的解决方案是当您想要存储它们时将您的 cookie 存储在 JSON 文件中,这样您以后就可以在浏览器中加载它们。

这是一个如何存储它们的快速教程:TUTORIAL

用JSON写:

import java.io.FileWriter;
import java.io.IOException;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

public class WriteJSONExample
{
  @SuppressWarnings("unchecked")
  public static void main( String[] args )
{
    //First Employee
    JSONObject employeeDetails = new JSONObject();
    employeeDetails.put("firstName", "Lokesh");
    employeeDetails.put("lastName", "Gupta");
    employeeDetails.put("website", "howtodoinjava.com");
     
    JSONObject employeeObject = new JSONObject(); 
    employeeObject.put("employee", employeeDetails);
     
    //Second Employee
    JSONObject employeeDetails2 = new JSONObject();
    employeeDetails2.put("firstName", "Brian");
    employeeDetails2.put("lastName", "Schultz");
    employeeDetails2.put("website", "example.com");
     
    JSONObject employeeObject2 = new JSONObject(); 
    employeeObject2.put("employee", employeeDetails2);
     
    //Add employees to list
    JSONArray employeeList = new JSONArray();
    employeeList.add(employeeObject);
    employeeList.add(employeeObject2);
     
    //Write JSON file
    try (FileWriter file = new FileWriter("employees.json")) {
        //We can write any JSONArray or JSONObject instance to the file
        file.write(employeeList.toJSONString()); 
        file.flush();

    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

读取JSON:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
 
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
 
public class ReadJSONExample 
{
    @SuppressWarnings("unchecked")
    public static void main(String[] args) 
    {
        //JSON parser object to parse read file
        JSONParser jsonParser = new JSONParser();
         
        try (FileReader reader = new FileReader("employees.json"))
        {
            //Read JSON file
            Object obj = jsonParser.parse(reader);
 
            JSONArray employeeList = (JSONArray) obj;
            System.out.println(employeeList);
             
            //Iterate over employee array
            employeeList.forEach( emp -> parseEmployeeObject( (JSONObject) emp ) );
 
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
 
    private static void parseEmployeeObject(JSONObject employee) 
    {
        //Get employee object within list
        JSONObject employeeObject = (JSONObject) employee.get("employee");
         
        //Get employee first name
        String firstName = (String) employeeObject.get("firstName");    
        System.out.println(firstName);
         
        //Get employee last name
        String lastName = (String) employeeObject.get("lastName");  
        System.out.println(lastName);
         
        //Get employee website name
        String website = (String) employeeObject.get("website");    
        System.out.println(website);
    }
}

关于java - 从一个 Selenium session 到另一个 Selenium session 长期保存 Cookie 的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66631147/

相关文章:

Java EE 6 @Inject 懒惰?

java - listview.setadapter(adapter) 生成的主要空异常

python - 在 Internet Explorer (Python) 中使用 Selenium 绕过 SSL 认证

java - Swing:仅使用 Netbeans 将 JFormattedTextField 设置为数字

Java 防止出于相同目的的方法重复 - 不同的参数

java - 有没有人尝试过为 appium 移动应用程序自动化创建本地设备实验室

django - Selenium/Django 给出外键错误

unit-testing - Wait Until 不存在,不适用于 Selenium C#

google-chrome - driver.manage().window().maximize();不管用

java - 如何最大化 Selenium 屏