首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保存和恢复watir会话

保存和恢复watir会话
EN

Stack Overflow用户
提问于 2013-08-17 19:25:03
回答 1查看 1.9K关注 0票数 4

我想用watir测试交互式身份验证。我需要在selenium服务器上打开浏览器,在没有用户交互的情况下输入他的登录/密码(存储在服务器上,用户不需要输入他们,他只需要输入验证码),新的带有“输入验证码”标签的文本字段出现,然后系统向用户发送验证码并关闭浏览器(这里我需要以某种方式保存会话)。用户接收验证码并将其发送到服务器,服务器打开新浏览器(以某种方式恢复保存的会话)并输入从用户接收的验证码。

我可以保持浏览器打开,只需在出现的文本字段中输入验证码,但如果用户不给我发送他收到的验证码,浏览器将保持打开,不是很好的解决方案。

所以,我尝试了这样的方法:

代码语言:javascript
复制
    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.

如何保存浏览器状态,将其关闭,然后使用相同的会话重新打开?

EN

回答 1

Stack Overflow用户

发布于 2013-09-12 17:56:44

代码语言:javascript
复制
  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

还有更多的源代码,但我不能全部分享,但逻辑是相似的

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18288244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档