2016-04-08 55 views
2

我想(ab)使用水豚網絡測試框架來自動化github上的一些任務,這些任務不能通過github API訪問,並且需要我登錄並點擊按鈕才能發送AJAX請求。如何在水豚中使用我自己的餅乾?

由於水豚/硒是一個測試框架,它有助於創建一個沒有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着陸頁,你會看到一個已登錄瀏覽器中的用戶或隱身模式。我希望獲得登錄的登錄頁面,例如我自己啓動了一個Web瀏覽器並導航到該URL。

因爲我有github上的2FA設置,使得從github登陸頁面的登錄過程自動化有點煩人,所以我想避免自動登錄到github。我想要自動執行的任務不需要通過2FA重新進行身份驗證。

答:

對於MacOSX的+紅寶石+硒這個工程:

#!/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" 

那麼火了鍍鉻與此:

% /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。

還有在硒的webdriver寶石紅寶石它插入一個「分離」選項,進入戰鬥與「debuggerAddress」的錯誤:

/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 

回答

1

在Ruby中實現類似的東西,看看this page是越過這一點。感謝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) 

爲了這個工作,你需要做的幾件事情。

手動啓動從終端/命令提示鉻與這些命令行參數 --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"的空間,只要它已登錄到有問題的網站,它會保持登錄狀態像一個正常的用戶,只要你按照這些指令來運行試驗。

當我彈出它時,我用它寫了一個快速的netflix bot that clicks the "continue playing" button,它是獲取DRM內容的唯一方法,就像我找到的一樣。但它保留了用於登錄的cookie,並且啓動了配置文件設置的任何組件的chrome。

我曾嘗試在使用不同的方法之前啓動具有特定配置文件的chrome,但這是真正強制它工作的唯一方法,我希望如此。

編輯:也有保存cookie信息的方法,雖然我不知道他們的工作效果如何。查看this link以獲取更多信息,因爲即使它可行,我的解決方案可能也不是最佳解決方案。

+1

我似乎已經找到了一個體面的頁面,介紹如何使用代碼片段注入ruby的chrome驅動程序中的選項,並在此處放置一個註釋:https://sites.google.com/a/chromium.org/chromedriver/capabilities – lamont

+0

好吧,足夠接近我會更新我的問題與答案在紅寶石... – lamont

+0

我會將此鏈接添加到答案,所以它更容易爲Ruby用戶可見。 – DuckPuncher

0

show_me_the_cookies gem提供了跨驅動程序的cookie操作,並且可以讓您添加新的cookie。有一兩件事要注意使用時硒是,你需要訪問域之前,你可以爲它創建的cookie,所以你需要做的是這樣

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

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

+0

這不是我所期待的,但是,我已經得到了所有我想用驅動器坐在我的驅動器上的cookie ......他們只需要正確加載(或者不會被清除掉)? – lamont