[英]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”已存在於同一 --user-data-dir 中(確保用戶配置文件 1 具有必要的 chrome://components/ 來運行需要這些組件的任何應用程序)
- 您可以使用任何空閑端口代替 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.