Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法在Selenium Webdriver中设置Cookie_Java_Testing_Cookies_Selenium Webdriver_Microsoft Edge - Fatal编程技术网

Java 无法在Selenium Webdriver中设置Cookie

Java 无法在Selenium Webdriver中设置Cookie,java,testing,cookies,selenium-webdriver,microsoft-edge,Java,Testing,Cookies,Selenium Webdriver,Microsoft Edge,在使用webdriver打开链接之前,我试图将cookie添加到链接中,但它始终给我以下错误: org.openqa.selenium.UnableToSetCookieException:无法设置cookie(警告:服务器未提供任何堆栈跟踪信息) 请在下面找到我的代码: System.setProperty("webdriver.edge.driver","C:\\Program Files\\Latest Webdriver\\MicrosoftWebDrive.exe" ); EdgeDr

在使用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称为无域cookie,我认为这是不可能的

我还没有找到在url之前删除cookie的方法,但我认为下面的场景可能会帮助您-

  • 创建factory类以创建webdriver实例
  • 在返回webdriver实例之前,请导航到测试域上的任何页面,并删除cookie,然后导航回浏览器
  • 您的测试现在可以开始了,不知道导航和cookie删除已经发生

  • 在导航到站点之前,您正在创建cookie。如果您试图在域www.example.com上创建cookie,那么您可能希望导航到该域上的某个页面,创建cookie,然后启动测试


    从我前一段时间的阅读中,最好的方法是导航到您知道域中不存在的某个页面,例如www.example.com/this404page,然后创建cookie。它应该加载得更快,因为它是一个错误页面,不应该包含太多内容。在404页面上创建cookie后,开始测试。

    首先导航到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);
    

    您无法执行此操作,因为WebDriver规范要求您将浏览器登录到您试图为其设置Cookie的域

    前面提到的解决方法是在设置cookie之前转到页面。但这会引起一些问题:

    不幸的是,这阻止了两个关键用例:

  • 您希望在新会话中重新使用来自另一个webdriver会话的Cookie,以避免重复获取Cookie所需的工作。例如必须重复登录
  • 允许在不相关的线程之间共享webdriver池,其中每个线程可能有自己的cookie
  • webdriver规范显然需要考虑这一点。我在这里提出了一个问题:


    给它一些选票。所有浏览器都应该开始采用一种方法来处理这个问题

    如果这更简单,我不需要创建工厂类,只需从站点加载根页面(不需要cookie)

    首先收集cookie,如上所述

    pickle.dump(driver.get_cookies(), open("ChromeCookies.pkl", "wb"))
    
    然后获取不需要cookie的网站根目录(在我的例子中)

    然后执行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.get(url_not_root_demanding_cookie_which_is_now_there)