使用Selenium在Chrome 86版中启用Cookie

问题描述

我正在尝试将带有Selenium的Java与chrome更新版本86一起用于自动化,但是它显示禁用了第三方Cookie。我正在工作的网站需要第三方Cookie。

我尝试使用以下代码启用Cookie:

    ChromeOptions options = new ChromeOptions();
    options.addArguments("incognito");
    options.addArguments("start-maximized");
    // options.addArguments("disable-infobars");
    options.addArguments("ignore-certificate-errors");
    options.addArguments("disable-popup-blocking");
    options.addArguments("disable-extensions");
    options.addArguments("disable-notifications");
    options.addArguments("no-sandBox");
    options.addArguments("allow-running-insecure-content");
    options.setAcceptInsecureCerts(true);

    options.setExperimentalOption("excludeSwitches",Collections.singletonList("enable-automation"));

    HashMap<String,Object> prefs = new HashMap<String,Object>();
    prefs.put("profile.default_content_settings.cookies",0);
    options.setExperimentalOption("prefs",prefs);

    Boolean headless = Boolean.valueOf(ApplicationProperties.getInstance().getProperty("headless"));
    if (Boolean.TRUE.equals(headless)) {
        options.addArguments("headless");
        options.addArguments("window-size=1600x1200");
    }

    options.setCapability(ChromeOptions.CAPABILITY,options);
    options.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIoUR,UnexpecteDalertBehavIoUr.IGnorE);````

不启用cookie。指导我该怎么办?

解决方法

我找到了一种解决方法,可以在浏览器的“新标签”开始页上启用第三方cookie(我正在使用Robot Java library库来打开新标签,因为其他方法无法打开相应的页面)。

完整答案here

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...