java - 使用 Selenium 在 Chrome 版本 86 中启用 Cookie
问题描述
我正在尝试将 Selenium 与 Java 一起使用,并通过更新 chrome 版本 86 进行自动化,但它显示第三方 cookie 已禁用。我正在处理的网站需要 3rd 方 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 库库打开一个新标签页,因为其他方法无法打开相应的页面)。
完整答案在这里。
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);
推荐阅读
- javascript - JSON 仅在逐字复制代码时才有效,生成的代码不起作用,为什么?
- node.js - Node.js 中的“NodeJS”模块是什么?(问是因为很难用谷歌搜索)
- java - 使用 APACHE JENA 自动检测文件扩展名
- excel - 宏减去多个单元格并输出结果
- mysql - 从 nodered 和 mysql 解析数组结果
- java - 如何将图像从 java-app 发送到 python?
- flutter - 如何在颤振中准备字符串变量格式?
- java - Spring for Kafka 2.3 在运行时使用 KafkaMessageListenerContainer 为特定侦听器设置偏移量
- nuxt.js - 是否可以在加载页面之前和来宾中间件之前设置 state.loggedIn?
- angular - 从 ion-tab-bar ionic 4 中删除白色背景