【问题标题】:Chrome/Firefox do not retain cookies when invoked via (Watir-)Webdriver?通过 (Watir-)Webdriver 调用时,Chrome/Firefox 不保留 cookie?
【发布时间】:2013-05-08 01:02:26
【问题描述】:

我正在为使用 Ruby 和 Watir 的客户开发一个项目。他要求在重新加载应用程序时恢复会话(以便保存他的登录状态)。这是 Chrome 的正常行为(看起来),Firefox 也可以选择这样做。

我已经尝试了所有我能想到的方法,但似乎无法使用 watir-webdriver 来完成这项工作。我已经指定 Watir 使用特定的配置文件(您认为它会解决问题),确保所有设置都是正确的(它们是正确的,因为它们在我自己启动浏览器时工作)。我已经尝试过使用各种开关和配置文件选项的 Chrome,我认为这可能会有所帮助。什么都没有。

所以,问题是,为什么会发生这种情况,我可以做些什么来解决或绕过这个问题?在这一点上,我几乎完全没有想法。我什至尝试在 IRB 中手动保存和重新加载 cookie,但无济于事......

我知道这一定是可能的,因为当我手动登录网站,关闭浏览器并重新打开它时,我仍然处于登录状态。我需要重现这种确切的行为,但某处出现了问题在 Chrome/Firefox 的手动实例和 Watir 控制的实例之间。

最后,我会提到我注意到,当我指定我的个人资料时,它会加载我的历史记录条目,但不会加载任何 cookie。这让我越来越困惑。

如果有人可以帮助我,将不胜感激。

【问题讨论】:

  • 请分享相关代码。
  • 这听起来像是 webdriver-chromedriver 的问题。 Watir-webdriver 位于这些之上,浏览器会话等的创建完全取决于 webdriver。我将相应地重新标记问题。

标签: google-chrome firefox webdriver watir-webdriver selenium-chromedriver


【解决方案1】:

我相信,按照设计,webdriver 总是明智地使用干净的 cookie 开始会话。

当您尝试进行模拟关闭和重新打开浏览器的测试时,这可能会使事情变得有些棘手(实际上在很多方面,测试浏览器而不是网站,因为网络服务器确实有无法知道浏览器已关闭并重新打开)

如果您想尝试保存和恢复 cookie,请阅读一些 webdriver 文档,在有关 cookie 的部分中说明了一个重要的警告

在我们离开这些后续步骤之前,您可能会对 了解如何使用 cookie。首先,你需要在 cookie 将对其有效的域。如果您尝试预设 在您开始与网站交互之前的 cookie,并且您的主页是 large / 需要一段时间来加载一个替代方法是找到一个较小的页面 在网站上,通常 404 页面很小 (http://example.com/some404page)

因此,如果您要尝试保存 cookie,然后在弹出浏览器后恢复它们,您可能需要导航到网站上的某个位置,然后再尝试重新创建 cookie。

我会通过 IRB 尝试一下,看看你会得到什么

【讨论】:

  • 非常感谢您的评论。当我来到这里时,我实际上已经尝试过,并且正在寻找不同的解决方案。我想,“为什么不找到一种方法来使用 Firefox 的内置功能来保存关闭之间的会话”?在此处查看我的答案以获取更多详细信息。
【解决方案2】:

嗯,好消息是我想出了一个解决方案。我想分享它,以防其他人遇到这个问题。我向你们中的那些人致以最诚挚的歉意。

我的最终解决方案如下:

  1. 专门为应用程序创建 Firefox 配置文件
  2. 将 Firefox 设置为“恢复 Windows 和选项卡”。这没有用(东西 使用 Watir/Selenium)并且会忽略设置,即使在 Firefox 认出了它们。
  3. 为了解决上述问题,我在以下位置找到了一个 user.js 文件 Selenium,手动将设置编辑为“Restore Windows & Tabs” 在这个文件中,并将文件粘贴到我的 Firefox 中的文件上 配置文件的目录 (~/.mozilla/firefox/*)。
  4. Firefox 将 prefs.js 中的首选项替换为 每次运行时的 user.js。这解决了它。

我会注意到,我实际上必须在 selenium-webdriver 本身中调整相当多的代码以使这一切顺利运行。 watir-webdriver 位于 selenium-webdriver 之上。

【讨论】:

  • 很高兴听到您找到了完成所需工作的方法。
  • 好久不见,查克。我想再次感谢您的回答。这是一个很好的答案,您完全正确地认为这是设计使然。让我大吃一惊的是,没有任何开源项目更符合我正在尝试做的事情的类型。网络上出现大量此类问题对我来说似乎很疯狂。无论如何,只是想让你知道你很感激。谢谢!
【解决方案3】:

如果您使用任何现有文件夹作为user-data-dir 开关,您将在浏览器关闭后保留所有文件和会话。否则,它会创建文件夹并在之后将其删除(连同所有 cookie、tmp 文件和会话)。

因此,您可以冷使用位于here 所述的任何现有配置文件或chrome://version/ url 处的默认路径

在我的例子中是/Users/mikhail/Library/Application Support/Google/Chrome/Default

由于某种原因,正确的路径应该是这个字符串,没有路径的最后一个“/默认”部分:

require 'watir-webdriver'

username = ENV['USER'] #or just your name
switches = %W[--user-data-dir=/Users/#{username}/Library/Application\ Support/Google/Chrome/]

browser = Watir::Browser.new :chrome, switches: switches
browser.goto 'google.com'

在这种情况下,您会保留所有历史记录和已安装的扩展程序。

或者更简单:

require 'watir-webdriver'

switches = %W[--user-data-dir=/some\ folder]
browser = Watir::Browser.new :chrome, switches: switches
browser.goto 'google.com'

在这种情况下,some folder 应该存在,您将从头开始创建新的配置文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 2015-11-29
    • 2012-03-17
    • 2018-03-07
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2011-10-11
    相关资源
    最近更新 更多