簡體   English   中英

C# Selenium/ChromeDriver 添加用戶配置文件首選項

[英]C# Selenium/ChromeDriver Add User Profile Preference

使用 selenium + chrome 驅動程序運行測試時,我需要允許所有 cookies。

我正在嘗試使用ChromeOptions.AddUserProfilePreference將其添加為配置文件首選項

我不是 100% 確定首選項名稱應該是什么以允許所有 cookies。我已經引用了這個文檔https://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/pref_names.cc?view =標記

並在我的設置中嘗試了以下方法,但沒有達到預期的效果。

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);

我遇到了同樣的問題。 我發現使用以下內容對我有幫助:

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

幫助我找到這個的建議是檢查 Chrome 首選項文件(在我的例子中C:\Users\<user>\AppData\Local\Google\Chrome\User Data\Default\Preferences )。 我保存了一份 cookies 被阻止的副本,然后將設置更改為允許所有 cookies 並比較了兩個版本,這為我突出顯示了受影響的控件。

看起來在 Chrome v86 中默認禁用第三方 cookies: Chromium SameSite Updates

我找到了在瀏覽器新標簽起始頁啟用第三方 cookies 的解決方法(我正在使用inputsimulator 庫打開新標簽,因為其他方法無法打開相應的頁面)。

這是 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM