C# Selenium/ChromeDriver Добавить настройку профиля пользователя

Мне нужно разрешить все файлы cookie при запуске тестов с драйвером selenium + chrome.

Я пытаюсь добавить это в качестве предпочтения профиля с помощью 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);

2 ответа

Я столкнулся с той же проблемой. Я обнаружил, что мне помогло следующее:

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

Совет, который помог мне найти это, заключался в том, чтобы проверить файл настроек Chrome (в моем случае C:\Users\<user>\AppData\Local\Google\Chrome\User Data\Default\Preferences). Я сохранил копию с заблокированными файлами cookie, затем изменил настройку, чтобы разрешить использование всех файлов cookie, и сравнил две версии, и это выделило для меня затронутый элемент управления.

Похоже, в Chrome v86 сторонние куки-файлы по умолчанию отключены: Chromium SameSite Updates.

Я нашел обходной путь для включения сторонних файлов cookie на начальной странице новой вкладки браузера (я использую библиотеку inputimulator, чтобы открыть новую вкладку, потому что другие методы не открывают соответствующую страницу).

Вот код C# для расширения IWebDriver:

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);
Другие вопросы по тегам