簡體   English   中英

如何在 capybara 中使用我自己的 cookie?

[英]How do I use my own cookies in capybara?

我正在嘗試(ab)使用 capybara web 測試框架來自動化 github 上的一些任務,這些任務無法通過 github API 訪問,並且需要我登錄並單擊按鈕以發送 AJAX 請求。

由於 capybara/selenium 是一個測試框架,它有助於創建一個沒有 cookie 的臨時會話。 我想阻止它這樣做,或者我想知道如何將我的 cookie 存儲加載到它創建的瀏覽器會話中。

我要做的就是:

#!/usr/bin/env ruby

require 'selenium-webdriver'

driver = Selenium::WebDriver.for :chrome
driver.navigate.to "https://github.com"

或這個:

#!/usr/bin/env ruby

require 'capybara'

Capybara.register_driver :selenium do |app|
  Capybara::Selenium::Driver.new(app, :browser => :chrome)
end

session = Capybara::Session.new(:selenium)
session.visit "https://www.github.com"

在這兩種情況下,我都會獲得 github.com 登錄頁面,您會在瀏覽器中看到作為注銷用戶或隱身模式。 我想獲得我的登錄登錄頁面,就像我自己啟動一個網絡瀏覽器並導航到那個 URL 一樣。

由於我在 github 上設置了 2FA,這使得從 github 登錄頁面自動登錄過程有些煩人,所以我想避免自動登錄 github。 我想要自動化的任務不需要通過 2FA 重新驗證。

回答:

對於 MacOSX+Ruby+Selenium 這有效:

#!/usr/bin/env ruby

require 'selenium-webdriver'

caps = Selenium::WebDriver::Remote::Capabilities.chrome("chromeOptions" => {"debuggerAddress" => "127.0.0.1:20480"}, detach: false)
driver = Selenium::WebDriver.for :chrome, :desired_capabilities => caps
driver.navigate.to "https://github.com"

然后用這個啟動chrome:

% /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --user-data-dir=/Users/lamont/Library/Application\ Support/Google/Chrome --profile-directory=Default --remote-debugging-port=20480

顯然這些路徑需要調整,因為它們以 OSX 為中心並且有我的 homedir。

ruby 的 selenium-webdriver gem 中還有一個錯誤,它插入了一個“分離”選項,該選項與“調試器地址”發生沖突:

/Users/lamont/.rvm/gems/ruby-2.2.4/gems/selenium-webdriver-2.53.0/lib/selenium/webdriver/remote/response.rb:70:in `assert_ok': unknown error: cannot parse capability: chromeOptions (Selenium::WebDriver::Error::UnknownError)
from unknown error: unrecognized chrome option: detach

可以編輯lib/selenium/webdriver/chrome/bridge.rb文件以將其作為快速破解:

      chrome_options['binary']                   = Chrome.path if Chrome.path
      chrome_options['nativeEvents']             = true if native_events
      chrome_options['verbose']                  = true if verbose
      #chrome_options['detach']                   = detach.nil? || !!detach
      chrome_options['noWebsiteTestingDefaults'] = true if no_website_testing_defaults
      chrome_options['prefs']                    = prefs if prefs

要在 Ruby 中實現類似的東西,請查看該頁面 感謝 lamont 在評論中讓我知道。

您可以使用特定的 Chrome 配置文件啟動 chrome。 我不確定ruby​​ 實現會是什么樣子,但在python中它看起來像:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options as ChromeOptions

options = ChromeOptions()
# more on this line here later.
options.add_experimental_option('debuggerAddress', '127.0.0.1:7878')
driver = webdriver.Chrome(chrome_options=otpions)

為了使它起作用,您需要做一些事情。

使用這些命令行參數從終端/命令提示符手動啟動 chrome --user-data-dir=/path/to/any/custom/directory/home/user/Desktop/Chromedir --profile-directory="Profile 1" --remote-debugging-port=7878

  1. 確保“配置文件 1”已存在於同一 --user-data-dir 中(確保用戶配置文件 1 具有必要的 chrome://components/ 來運行需要這些組件的任何應用程序)
  2. 您可以使用任何空閑端口代替 7878 驗證http://localhost:7878是否正在運行並返回值。

這應該使用"Profile 1"配置文件手動啟動 chrome,只要它已登錄到相關站點,只要您按照這些說明運行測試,它就會像普通用戶一樣保持登錄狀態。

我用它編寫了一個快速的netflix 機器人,當它彈出時單擊“繼續播放”按鈕,這是我發現的唯一可以播放 DRM 內容的方法。 但它保留了用於登錄的 cookie,並使用配置文件設置的任何組件啟動 chrome。

在使用不同的方法之前,我曾嘗試使用特定配置文件啟動 chrome,但這是真正強制它按我想要的方式工作的唯一方法。

編輯:雖然我不知道它們的工作情況如何,但也有保存 cookie 信息的方法。 查看此鏈接以獲取更多信息,因為我的解決方案可能不是最好的解決方案,即使它有效。

show_me_the_cookies gem 提供跨驅動程序 cookie 操作,可以讓您添加新的 cookie。 使用 selenium 時要注意的一件事是,您需要先訪問域,然后才能為其創建 cookie,因此您需要執行類似的操作

visit "https://www.github.com"
create_cookie(...)
visit "https://www.github.com"

讓它工作 - 第一次訪問只是將瀏覽器/驅動程序置於可以創建 cookie 的狀態,第二次訪問實際上是轉到設置了 cookie 的頁面。

我不得不調整 OP 的答案(從她的問題中)以在 2022 年與 Ruby 一起實現這一點。

先決條件

Chromedriver 已安裝並允許運行,即使它沒有簽名:

> brew install chromedriver
> xattr -d com.apple.quarantine /usr/local/bin/chromedriver

Chrome 在特定端口上啟動並接受命令:

> /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --user-data-dir=~/Library/Application\ Support/Google/Chrome --profile-directory=Default --remote-debugging-port=20480

這在 Chrome 中創建了一個新的配置文件,因此我登錄了我的帳戶並設置了瀏覽器,准備開始與我試圖自動化的(舊版 EdTech)網站進行交互。

實際使用

require 'selenium-webdriver'

caps = Selenium::WebDriver::Remote::Capabilities.chrome("goog:chromeOptions" => {"debuggerAddress" => "127.0.0.1:20480"})
driver = Selenium::WebDriver.for :chrome, capabilities: caps

driver.navigate.to "https://www.google.com"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM