【问题标题】:Handling Basic Authentication in Karate UI scenario在空手道 UI 场景中处理基本身份验证
【发布时间】:2020-06-05 13:17:50
【问题描述】:

我刚刚开始实施空手道 UI (v0.9.5)。已经用空手道实现了api测试,效果很好。

遵循此页面上的 HTTP 基本身份验证策略 - https://github.com/intuit/karate#http-basic-authentication-example 基本身份验证处理适用于 api 测试。我设置了一次 HTTP 标头并运行所有 api 测试。 现在进行 UI 测试,我打开的 URL 会弹出基本的身份验证弹出窗口,如下所示:

所以我认为我可以使用与 api 测试相同的策略来处理这个问题。在我的功能文件的背景部分,我调用进行身份验证的功能文件并设置如下标题:

设置标题的调用功能文件(admin-headers.feature)。通过 karate-config.js 执行管理员用户登录后,此功能文件获取令牌。然后将令牌与 Base64 编码的基本身份验证一起分配给调用 headers.js 的标头。 Base64 用户和密码作为 maven 参数输入,并通过 karate-config 变量读取。

(/admin-headers.feature)

Feature: karate-config.js will perform one time login for admin and
  set the session token for all subsequent requests

  Background:
    * def session = adminAuthInfo.authSession
    * def basic_auth = call read('classpath:basic-auth.js') { username: '#(basicAuthUser)', password: '#(basicAuthPassword)' }
    * configure headers = read('classpath:headers.js')

  Scenario: One-time login for user and set the
    session token in request header

上述功能文件(/headers.js)返回Auth和Cookie的js代码。

function() {
    var session = karate.get('session');
    var basic_auth = karate.get('basic_auth');
    if(session){
        return {
            Authorization: basic_auth,
            Cookie: "SESSION=" + session
        };
    } else {
        return {};
    }
}

我的 UI 测试功能文件(/ui-test.feature):

Feature: Login test

  Background:
    # Authorise via api
    * callonce read('classpath:common/headers/admin-headers.feature') 
    * configure driver = { type: 'chrome' }

  Scenario: Test login
    Given driver 'https://test.internal.mysite.com/names'

运行上述功能文件仍会显示身份验证弹出窗口。

然后我尝试在初始化驱动程序时设置 cookie(我认为这可能不是正确的方法?)如下:

Feature: Login test

  Background:
    # Authorise via api
    * def login = callonce read('classpath:common/headers/admin-headers.feature')
    * def uiCookie = { name: 'SESSION', value: '#(login.userAuthInfo.authSession)', domain: 'test.internal.mysite.com' }
    * configure driver = { type: 'chrome', cookie: '#(uiCookie)' }

  Scenario: Test login
    Given driver 'https://test.internal.mysite.com/names'

以上也行不通。我在这里做错了什么?一直弹出是因为初始化驱动时没有设置cookie然后打开指定的url?

非常感谢您的帮助。

【问题讨论】:

    标签: karate


    【解决方案1】:

    我认为你提出了一个很好的功能请求,configure driver 也应该接受 cookie,以便您可以导航到页面并一次性设置 cookie,我打开了一个功能请求:https://github.com/intuit/karate/issues/1053

    所以试试这个顺序,参考文档cookie():https://github.com/intuit/karate/tree/master/karate-core#cookieset

    * driver 'about:blank'
    * cookie(uiCookie)
    * driver 'https://test.internal.mysite.com/names'
    

    现在它应该可以工作了!

    【讨论】:

    • 我尝试了上述方法。我使用默认驱动程序运行它:chrome,我可以在 karate.log 中看到设置了 cookie。但是当我在设置 cookie 后打开 url 时,仍然会得到基本的身份验证弹出窗口。打印 cookie 会显示 cookie 信息。可能是 chrome 有一些东西不能让你自动化这一点吗?我还尝试使用驱动程序运行它:chromedriver 并且对于此设置,cookie 给出了一个错误 - “无效域”。有什么想法吗?
    • @rochitsen 不幸的是没有想法。检查您是否需要domain 密钥:github.com/intuit/karate/tree/master/karate-core#cookieset - 如果您研究所需的 cookie 并设置它们 - 您应该能够绕过登录。如果需要,请与您的前端开发团队合作 - 最后的手段,请遵循以下流程:github.com/intuit/karate/tree/develop/examples/ui-test
    • 所以我尝试将其作为驱动程序打开的登录 url - 'basicauthUser:basicAuthPassword@test.internal.mysite.com/login'。通过这种方式,我能够绕过基本的身份验证弹出窗口(调用功能中的登录代码)。登录页面打开,我使用空手道登录并自动设置了 cookie。将控制权返回给我的调用功能(实际测试),然后打开其他页面“/名称”并且测试成功。我已经成功地为驱动程序类型运行了这个:chrome 和 chromedriver。希望这个解决方案能长期有效。
    • @rochitsen 是的,听起来不错。您可以尝试进行实验以提取 cookie 值并使用我的答案中的模式使用该值 - 如果它不起作用 - 请尝试向我们传递信息以提高空手道,请参阅我上一条评论中的链接。并阅读此内容:) stackoverflow.com/help/someone-answers
    猜你喜欢
    • 2021-06-30
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    相关资源
    最近更新 更多