我试图在使用 webdriver 打开链接之前将 cookie 添加到链接中,但它一直给我这个错误:
org.openqa.selenium.UnableToSetCookieException:无法设置 cookie(警告:服务器未提供任何堆栈跟踪信息)
请在下面找到我的代码:
System.setProperty("webdriver.edge.driver","C:\\Program Files\\Latest Webdriver\\MicrosoftWebDrive.exe" );
EdgeDriver = new EdgeDriver();
Thread.sleep(2000);
Cookie cookie = new Cookie("Testing", "11111");
EdgeDriver.manage().addCookie(cookie);
EdgeDriver.get("https://www.google.ca/?gws_rd=ssl"); // The link is an example
请帮忙提供相关解决方案。
您在导航到该网站之前创建 cookie。如果您尝试在域 www.example.com 上创建 cookie,那么您可能需要导航到该域上的某个页面,创建 cookie,然后开始测试。
根据我不久前的阅读,最好的方法是导航到您知道域中不存在的某个页面,例如www.example.com/this404page,然后创建 cookie。它的加载速度应该更快,因为它是一个错误页面并且不应该包含太多内容。在404页面上创建cookie后,开始测试。
您无法执行此操作,因为 WebDriver 规范要求您将浏览器登录到您尝试为其设置 cookie 的域。
提到的解决方法是转到设置 cookie 之前的页面。但这会导致一些问题:
不幸的是,这阻止了 2 个关键用例:
Webdriver 规范显然需要考虑到这一点。我在这里提出了一个问题:
https://github.com/w3c/webdriver/issues/1238
给它一些选票。所有浏览器都应该开始提供一种方法来处理这个问题。
首先导航到 URL,然后尝试添加 cookie,尝试以下代码:
System.setProperty("webdriver.edge.driver","C:\\Program Files\\Latest Webdriver\\MicrosoftWebDrive.exe" );
EdgeDriver = new EdgeDriver();
Thread.sleep(2000);
Cookie cookie = new Cookie("Testing", "11111");
EdgeDriver.manage().addCookie(cookie);
EdgeDriver.get("https://www.google.ca/?gws_rd=ssl"); // The link is an example
用此替换您的代码:
System.setProperty("webdriver.edge.driver","C:\\Program Files\\Latest Webdriver\\MicrosoftWebDrive.exe" );
EdgeDriver = new EdgeDriver();
Thread.sleep(2000);
EdgeDriver.get("https://www.google.ca/?gws_rd=ssl"); // The link is an example
Cookie cookie = new Cookie("Testing", "11111");
EdgeDriver.manage().addCookie(cookie);
在导航到域之前添加 cookie 称为无域 cookie,我认为这是不可能的。
我还没有找到在 url 之前删除 cookie 的方法,但我认为下面的场景可能会帮助你 -
以防万一这更简单,我不需要创建工厂类,只需从站点加载根页面(不需要 cookie)
首先按照上述方式收集cookie
pickle.dump(driver.get_cookies(), open("ChromeCookies.pkl", "wb"))
然后获取不需要cookie的网站根目录(在我的例子中)
driver.get(url_root)
然后执行cookie加载
for cookie in pickle.load(open("ChromeCookies.pkl", "rb")):
driver.add_cookie(cookie)
然后转到我真正想要访问的页面
driver.get(url_not_root_demanding_cookie_which_is_now_there)
如果此方法有问题,请发帖
driver.execute_cdp_cmd('Network.enable', {})
driver.execute_cdp_cmd('Network.setCookie', cookie)
driver.execute_cdp_cmd('Network.disable', {})
即使当前 url 域不在 cookies 域中,这也有效。
更多文档在这里:
https://chromedevtools.github.io/devtools-protocol/tot/Network/#method-setCookie