2013-08-17 178 views
4

我想的Watir測試交互認證。我需要的硒服務器上一次打開瀏覽器,而無需用戶交互輸入他的登錄/密碼(存儲在服務器上,用戶沒有輸入他們,他只是要輸入驗證碼),用「輸入驗證碼」標籤出現新的文本域,那麼系統會向用戶發送驗證碼並關閉瀏覽器(這裏我需要以某種方式保存會話)。用戶收到驗證碼併發送到服務器,服務器打開新的瀏覽器(恢復某種保存的會話)並輸入從用戶收到的驗證碼。保存和恢復的Watir會議

我可以保持瀏覽器打開,只出現在文本字段中輸入驗證碼,但如果用戶不給我說,他收到的驗證碼,瀏覽器將繼續開放,沒有很好的解決辦法。

所以,我想是這樣的:

params = { login: 'userexample.com', password: '123456' } 
    adapter = Adapters::Test.new(params) 

    adapter.sign_in #opens browser, fills credentials fields, clicks 'get verification code', 'enter verification code' field appears 

    cookies = adapter.browser.cookies.to_a #save browser state 
    url  = adapter.browser.url 
    adapter.browser.close 

    adapter = Adapters::Test.new(params) 
    adapter.browser.goto url 

    adapter.browser.cookies.clear 

    cookies.each do |saved_cookie| 
     adapter.browser.cookies.add(saved_cookie[:name], saved_cookie[:value]) 
    end 

    adapter.browser.refresh #I should be on the same page with appeared 'enter verification code' field, but nothing happens after refresh, I am still on the main page with only login/password fields. 

我如何保存瀏覽器狀態,關閉它,然後用相同的會話重新打開?

+0

爲什麼瀏覽器仍然敞開,如果用戶不發送的驗證碼?如果您將瀏覽器的關閉設置爲救援或確保攔截或測試拆卸,瀏覽器將始終關閉。 –

+0

不管怎樣,在這種情況下,瀏覽器,直到事情發生照常開放(用戶輸入密碼,超時到達)。但是有太多的用戶和硒中樞並沒有太多的節點來保持其中一些開放。無法承擔閒置的瀏覽器活着。 –

回答

3
def prepare_for_sign_in 
    browser.goto login_url 

    browser.text_field(:name => "login").set("admin") 
    browser.text_field(:name => "password").set("admin") 

    browser.a(:class => "enter").click 

    until browser.div(:text => /Welcome/).present? do 
     if browser.div(:class => 'error').text.include?("incorrect username or password") 
     raise InvalidCredentials.new("Invalid login or password.") 
     end 
    end 

    # here you need to sleep few secs or use similar conditional wait 
    Watir::Wait.until { browser.cookies.to_a.first[:name] == "JSESSIONID" } 

    params["interactive_data"] = { 
     "cookies" => JSON.parse(browser.cookies.to_a.to_json), 
     "proceed_url" => browser.url 
    } 
    end 

    def sign_in 
    restore_cookies(params["interactive_data"]["proceed_url"]) 

    browser.text_field(:name => "sms").set('123456') 
    browser.a(:text => "Proceed").click 
    end 

    def restore_cookies(url) 
    browser.goto url 
    browser.cookies.clear 

    params["interactive_data"]["cookies"].each do |cookie| 
     browser.cookies.add(
     cookie["name"], 
     cookie["value"], 
     { 
      domain: cookie["domain"], 
      path: cookie["path"], 
      expires: cookie["expires"], 
      secure: cookie["secure"] 
     } 
    ) 
    end 
    browser.goto url 
    browser.refresh 
    end 

有一些更多的源代碼,但我不能分享這一切,但邏輯是類似