【问题标题】:C# Selenium/ChromeDriver Add User Profile PreferenceC# Selenium/ChromeDriver 添加用户配置文件首选项
【发布时间】:2020-10-09 13:38:56
【问题描述】:

在使用 selenium + chrome 驱动程序运行测试时,我需要允许所有 cookie。

我正在尝试使用 ChromeOptions.AddUserProfilePreference 将其添加为个人资料首选项

我不能 100% 确定允许所有 cookie 的首选项名称应该是什么。我已经引用了这个文档https://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/pref_names.cc?view=markup

并在我的设置中尝试了以下方法,但没有达到预期的效果。

options.AddUserProfilePreference("profile.block_third_party_cookies", false);
options.AddUserProfilePreference("security.cookie_behavior", 0);```

这是我的设置代码

                        new DriverManager().SetUpDriver(new ChromeConfig());
                        var options = new OpenQA.Selenium.Chrome.ChromeOptions { };
                        options.AddArgument("–no-sandbox");
                        options.AddArguments("-disable-gpu");
                        options.AddArguments("-disable-dev-shm-usage");
                        options.AddArgument("-incognito");
                        options.AddArgument("-start-maximized");
                        options.AddUserProfilePreference("security.cookie_behavior", 0);
                        CurrentWebDriver = new ChromeDriver(options);

【问题讨论】:

    标签: c# selenium selenium-chromedriver


    【解决方案1】:

    我遇到了同样的问题。我发现使用以下内容对我有帮助:

    options.AddUserProfilePreference("profile.cookie_controls_mode", 0);
    

    帮助我找到这个的建议是检查 Chrome 首选项文件(在我的例子中是 C:\Users\<user>\AppData\Local\Google\Chrome\User Data\Default\Preferences)。我保存了一个阻止 cookie 的副本,然后将设置更改为允许所有 cookie 并比较两个版本,这对我来说突出显示了受影响的控件。

    【讨论】:

    • 很好的解决方案,也为我工作,谢谢
    【解决方案2】:

    看起来在 Chrome v86 中默认禁用第三方 cookie:Chromium SameSite Updates

    我找到了在浏览器新标签页起始页上启用第三方 cookie 的解决方法(我使用 inputsimulator library 打开新标签页,因为其他方法无法打开相应的页面)。

    这是 IWebDriver 扩展的 C# 代码:

    using WindowsInput;
    using WindowsInput.Native;
    
    public static void EnableThirdPartyCookies(this IWebDriver driver)
    {
        var windowHandles = driver.WindowHandles;
    
        // Activate Browser window
        driver.SwitchTo().Window(driver.WindowHandles.Last());
        
        // Open New Tab Ctrl + T    
        new InputSimulator().Keyboard.ModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_T);
    
        // Wait for open new tab
        const int retries = 100;
        for (var i = 0; i < retries; i++) 
        {
            Thread.Sleep(100);
            if (driver.WindowHandles.Count > windowHandles.Count)
                break;
        }
    
        // Enable Third Party Cookies
        if (driver.WindowHandles.Count > windowHandles.Count)
        {
            driver.Close();
            driver.SwitchTo().Window(driver.WindowHandles.Last());
            var selectedCookieControlsToggle = driver.FindElements(By.Id("cookie-controls-toggle"))
                .FirstOrDefault(x => x.GetAttribute("checked") != null);
            selectedCookieControlsToggle?.Click();
        }
    }
    

    使用:

    var chromeService = ChromeDriverService.CreateDefaultService();
    var options = new ChromeOptions { };
    options.AddArgument("–no-sandbox");
    options.AddArgument("-incognito");
    options.AddArgument("-start-maximized");
    var driver = new ChromeDriver(chromeService, options);
    driver.EnableThirdPartyCookies();
    

    这是 Java 代码:

    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.chrome.ChromeOptions;
    import org.openqa.selenium.remote.RemoteWebDriver;
    import java.awt.*;
    import java.awt.event.KeyEvent;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Optional;
    
    public void enableThirdPartyCookies(WebDriver driver) throws Exception {
        ArrayList<String> windowHandles = new ArrayList<String> (driver.getWindowHandles());
    
        // Activate Browser window
        driver.switchTo().window(driver.getWindowHandle());
    
        // Open New Tab Ctrl + T
        Robot robot = new Robot();
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_T);
        robot.keyRelease(KeyEvent.VK_T);
        robot.keyRelease(KeyEvent.VK_CONTROL);
    
        // Wait for open new tab
        int retries = 100;
        for (int i = 0; i < retries; i++)
        {
            Thread.sleep(100);
            if (driver.getWindowHandles().size() > windowHandles.size())
                break;
        }
    
        // Enable Third Party Cookies
        if (driver.getWindowHandles().size() > windowHandles.size())
        {
            driver.close();
            windowHandles = new ArrayList<String> (driver.getWindowHandles());
            driver.switchTo().window(windowHandles.get(windowHandles.size() - 1));
            List list = driver.findElements(By.id("cookie-controls-toggle"));
            Optional<WebElement> selectedCookieControlsToggle = driver.findElements(By.id("cookie-controls-toggle")).stream()
                    .filter(x -> x.getAttribute("checked") != null).findFirst();
            Optional.ofNullable(selectedCookieControlsToggle).get().get().click();
        }
    }
    

    使用:

    ChromeOptions options = new ChromeOptions();
    options.addArguments("–no-sandbox");
    options.addArguments("incognito");
    options.addArguments("start-maximized");
    WebDriver driver = new ChromeDriver(options);
    enableThirdPartyCookies(driver);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 2019-03-15
      • 1970-01-01
      • 2017-11-29
      • 2021-12-22
      相关资源
      最近更新 更多