【问题标题】:How can I refresh my Selenium ChromeDriver instance without losing the cookies?如何在不丢失 cookie 的情况下刷新我的 Selenium ChromeDriver 实例?
【发布时间】:2016-05-11 09:26:19
【问题描述】:

在手动测试用例中,我试图在 Selenium 中使用 C# 自动化,它说:“登录并激活复选框‘记住我’,关闭浏览器,打开浏览器,检查用户是否仍然登录。 "

手动执行,这当然是成功的。使用 Chrome 中的 Selenium,我总是会在会话之间丢失 cookie。

到目前为止我尝试了什么:

public static void RefreshDriver(TestParams testParams)
{
    var cookies = testParams.Target.Driver.Manage().Cookies.AllCookies;
    var url = new Uri(testParams.Target.Driver.Url);

    testParams.Target.Driver.Quit();
    testParams.Target = testParams.Target.Clone(); // creates new ChromeDriver()

    string temp = url.GetLeftPart(UriPartial.Authority);
    testParams.Target.Driver.Navigate().GoToUrl(temp);
    foreach (Cookie cookie in cookies)
    {
        testParams.Target.Driver.Manage().Cookies.AddCookie(cookie);
    }
    testParams.Target.Driver.Navigate().GoToUrl(url);
}

这就是我创建 ChromeDriver 的方式:

private ChromeDriver _CreateChromeDriver(string httpProxy)
{
    var options = new ChromeOptions();

    string tempDir = @"C:\Users\Kimmy\Documents\MyUserDataDir";

    options.AddArgument("user-data-dir=" + tempDir);
    if (!string.IsNullOrEmpty(httpProxy))
    {
        options.Proxy = new Proxy {HttpProxy = httpProxy};
    }

    return new ChromeDriver(options);
}

当我执行我的测试用例并到达带有RefreshDriver() 的部分时,首先我的用户再次登录。但是,当我开始将产品添加到购物篮时,我的用户突然不再登录了。

有没有办法告诉 Chrome 跨会话保留 cookie,而无需手动保存和恢复 cookie?

【问题讨论】:

  • 你能告诉我们cookies是什么样的吗?实际上它们应该属于浏览器,WebDriver 只是您将它们传递给/从浏览器传递的机制。你确定你没有任何自动清除它们的规则/标志吗?

标签: c# selenium cookies selenium-webdriver selenium-chromedriver


【解决方案1】:

我使用 java 编程语言编写了一个类似的程序。 请参考以下代码。它可能对你有帮助。 出于可读性目的,程序有许多 cmets。

public class CookieHandling {
public WebDriver driver;

    @Test
    public void test() throws InterruptedException{
        driver=new FirefoxDriver();
        driver.manage().window().maximize();

        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        driver.get("http://gmail.com/");
        //Login. So new session created
        driver.findElement(By.id("Email")).sendKeys("email id here");
        driver.findElement(By.id("Email")).sendKeys(Keys.ENTER);
        driver.findElement(By.id("Passwd")).sendKeys("mail password here");
        driver.findElement(By.id("Passwd")).sendKeys(Keys.ENTER);

        //Store all set of cookies into 'allCookies' reference var.
        Set<Cookie> allCookies=driver.manage().getCookies();
        driver.quit();//Quitting the firefox driver
        Thread.sleep(3000);
        //Opening the chrome driver
        System.setProperty("webdriver.chrome.driver","C:\\Users\\kbmst\\Desktop\\temp\\chromedriver.exe");
        //System.setProperty("webdriver.ie.driver","C:\\Users\\kbmst\\Desktop\\temp\\IEDriverServer.exe");
        driver=new ChromeDriver();
        driver.manage().window().maximize();
        //It is very import to open again the same web application to set the cookies.
        driver.get("http://www.gmail.com/");
        //Set all cookies you stored previously
        for(Cookie c:allCookies){
            driver.manage().addCookie(c);
        }
        //Just refresh using navigate()
        driver.navigate().refresh();
    }
}

【讨论】:

  • 您正在将 Firefox cookie 复制到 Chrome。那不是我想做的。此外,我在我的代码 sn-p 中尝试了同样的事情,但它不起作用。我想做的是告诉浏览器(或 ChromeDriver)跨会话保留 cookie,就像 Internet Explorer 在没有明确告诉它的情况下所做的那样。
  • 我认为我们的程序中没有管理会话的选项/方法。会话仅与浏览器相关。可以使用 cookie 对其进行跟踪。于是就写了这样一个逻辑。
  • 也许它对你有用,但它对我不起作用,正如我在我的问题中所说的那样。用户在新的浏览器窗口中登录,但是一旦我开始将产品添加到购物篮中,用户就不再登录了。如果我在没有 Selenium 的情况下手动执行相同的操作,一切正常。我希望 Selenium 中的浏览器行为相同:关闭窗口并再次打开时保留 cookie。应该有比保存和恢复 cookie 更简单的解决方案。
猜你喜欢
  • 2015-04-13
  • 2022-12-06
  • 1970-01-01
  • 2023-03-20
  • 2022-10-19
  • 2022-01-14
  • 1970-01-01
  • 2011-07-23
  • 2013-04-07
相关资源
最近更新 更多