0

我正在尝试创建一个 Java Selenium WebDriver 脚本来设置 Chrome 和 Firefox 浏览器。Firefox 非常简单且成功。但是,我在设置 Chrome 代码部分来做同样的事情时遇到了 2 个问题。我在 Linux 环境中工作。

  1. 我无法让我的代码选择正确的 Chrome 配置文件。它一直在我的个人资料路径的末尾加上“默认”一词,因此没有选择预制的个人资料。
  2. 我不知道如何让 Chrome 自动选择导入的证书。在 Firefox 中,我创建了单独的配置文件,并且只导入了我希望它选择的一个 PKI 证书....简单对!我似乎无法用 Chrome 做到这一点。我可以制作个人资料。但是,每个配置文件都会看到我曾经导入的每个 PKI 证书。“不好玩!!!”

这是我在 StackOverlow 的帮助下自己研究和完成的。

  1. 我创建了 6 个不同的 Chrome 配置文件。user1、user2、user3、user4、user5 和 user6,并给他们每个人自己的图标。
  2. 我可以在命令行中使用 Chrome://version 找到配置文件位置。我的个人资料位于:/home/user/.config/google-chrome/Profile 1。其他人按预期位于 Profile 2-6。
  3. 我已将自己的证书和所有 5 个测试证书导入 Chrome 浏览器中隐私和安全 > 安全 > 管理证书 > “您的证书”下的“您的证书”。不幸的是,每个配置文件都在“您的证书”选项卡中看到所有导入的证书???在 Firefox 中,我只看到该配置文件的一个导入证书???

这是我编写的 InvokeBrowser 类,它可以完美地处理 Firefox,但不适用于 Chrome。

    package aTestNG;

import java.util.HashMap;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.firefox.ProfilesIni;

public class InvokeBrowser {
    private WebDriver driver;

    // The following code determines which browser to set up (e.g., Firefox or
    // Chrome). This code works!!!
    public WebDriver setBrowserBasicsByUser(String browserType, String userSid) {
        if (browserType.equalsIgnoreCase("FireFox")) {
            driver = setFireFoxBrowser(userSid);
        } else if (browserType.equalsIgnoreCase("Chrome")) {
            driver = setChromeBrowser(userSid);
        }
        return driver;
    }

    // This sets up the Firefox browser settings.
    // This code works!!!
    private WebDriver setFireFoxBrowser(String userSid) {
        try {
            System.out.println("Starting Firefox Driver Setup.");

            // This is the location of my appropriate driver.
            System.setProperty("webdriver.gecko.driver", "/home/user/SwDev/BrowserDrivers/geckodriver");

            // This code lets me pick my desired profile and PKI test certificate for the test.
            ProfilesIni profIni = new ProfilesIni();
            FirefoxProfile ffProfile = profIni.getProfile(userSid);

            // This code gives me my desired browser preferences.
            ffProfile.setPreference("security.default_personal_cert", "Select Automatically");
            ffProfile.setPreference("browser.startup.homepage", "https://home.page.some.site.com/");
            ffProfile.setPreference("startup.homepage override url", "https: //home.page.some.other.site.com/");
            ffProfile.setAcceptUntrustedCertificates(false);
            ffProfile.setAssumeUntrustedCertificateIssuer(false);

            // This code puts the Firefox profile, options, and preferences together.
            FirefoxOptions ffOpts = new FirefoxOptions();
            ffOpts.setProfile(ffProfile);

            // This code builds the desired Firefox driver and returns it to the calling
            // method.
            driver = new FirefoxDriver(ffOpts);
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
            driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
            driver.manage().window().maximize();
            System.out.println("Firefox Driver Setup complete.");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return driver;
    }

    // This sets up the Chrome browser settings.
    // TODO This code does not works!!! I want it to do the same things as the Firefox code above.
    private WebDriver setChromeBrowser(String userSid) {
        try {
            System.out.println("Starting Chrome Driver Setup.");
            // Point to the proper Chrome driver location.
            System.setProperty("webdriver.chrome.driver", "/nome/user/SwDev/BrowserDrivers/chromedriver");

            // Make a HashMap for locating the Chrome Profile based on userSid.
            HashMap<String, String> chromeProfileLocation = new HashMap<String, String>();
            chromeProfileLocation.put("userl", "/home/user/.config/google-chrome/Profile 1");
            chromeProfileLocation.put("user2", "/home/user/.config/google-chrome/Profile 2");
            chromeProfileLocation.put("user3", "/home/user/.config/google-chrome/Profile 3");
            chromeProfileLocation.put("user4", "/home/user/.config/google-chrome/Profile 4");
            chromeProfileLocation.put("user5", "/home/user/.config/google-chrome/Profile 5");
            chromeProfileLocation.put("user6", "/home/user/.config/google-chrome/Profile 6");
            String chromeProfilePath = chromeProfileLocation.get(userSid);

            // Now use the chromeProfileLocation and the chromeProfilePath in the Chrome  Options function.
            // Create ChromeOptions to execute start-up commands to be executed.
            ChromeOptions opts = new ChromeOptions();
            opts.addArguments("--no-default-—browser-check");
            opts.addArguments("--ignore-certificate-errors");
            opts.addArguments("--user-data-dir=" + chromeProfilePath);
            opts.addArguments("--login-profile");
            
            // Now create the driver with all the desired Chrome Options needed.
            driver = new ChromeDriver(opts);
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
            driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
            driver.manage().deleteAllCookies();
            driver.manage().window().maximize();
            System.out.println("Chrome Driver Setup complete.");
        } catch (Exception e) {
            e.printStackTrace();
        }

        return driver;
    }

}

这是我的问题。当此代码运行时,我没有得到正确的配置文件。它会在其中创建一个新目录并将“默认”一词添加到配置文件位置。因此,我没有得到我为测试构建的“真实配置文件”。

有人可以告诉我我错过了什么或误解了什么吗?

  1. 首先,这是我在脚本运行时获得的配置文件信息。这是从此代码创建的配置文件。请查看最后一行“配置文件路径”。它快把我逼疯了!!!!
  2. 其次,如何让 Chrome 在我选择正确的配置文件后自动选择 PKI 证书?当您设置个人配置文件时,Firefox 可以选择在浏览器中自动选择个人证书。

这是我使用 chrome://version 命令时得到的信息。Google Chrome 89.0.4389.90(官方版本)(64 位)

修订版 62eb262cdaae9ef819aadd778193781455ec7a49-refs/branch-heads/4389@{#1534}

操作系统 Linux JavaScript V8 8.9.255.20 用户代理 Mozilla/5.0 (X11; Linux x86 64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 命令行 /usr/bin/google-chrome --disable-后台网络 --disable-client-side-phishing-detection --disable-default--apps --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --enable-automation --enable-blink-features=ShadowDOMVO --enable-logging

--ignore-certificate-errors --log-level=0 --login-profile --no-default-browser-check --no-first-run --no-service-autorun --password-store=basic - -远程调试端口=0

--test-type=webdriver --use-mock-keychain --user-data-dir=/home/user/.config/google-chrome/Profile 1 --flag-switches-begin --flag-switches-end

可执行路径 /opt/google/chrome/google-chrome

配置文件路径 /home/user/.config/google-chrome/Profile 1/Default

4

0 回答 0