使用 selenium 和 Keyclock 进行验收测试:身份验证不起作用

问题描述

问题:

我的任务是为应用程序实施验收测试。

从简单开始,我想测试以下内容

Scenario: Authenticated employee see its own profile
   Given Employee is Authenticated
   When Employee navigate to his profile page
   Then Employee should see the page title as "EmployeeProfile"

我一直在尝试使用 selenium wed-driver 导航到应用程序中的员工个人资料 URL,因为它无法识别身份验证。

测试将使用 Cucumber 和 Selenium 实施。 Cucumber 中的步骤使用 selenium-cucumber 在 Ruby 中实现。 我的应用程序使用 Keyclock 进行身份和访问管理。

我在做什么:

这是我实例化网络驱动程序的方式

ENV['HTTP_PROXY'] = ENV['http_proxy'] = '127.0.0.1:8080'
proxy = Selenium::WebDriver::Proxy.new(http: '127.0.0.1:8080')
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(proxy: proxy)
capabilities['acceptSslCerts'] = true
capabilities['ignore-certificate-errors'] = true
$driver = Selenium::WebDriver.for(:chrome,desired_capabilities: capabilities)

为了导航到特定的应用程序 URL,我首先尝试通过调用用户进行身份验证:

def authenticate()
  connection = Faraday.new
  response = connection.post do |request|
      request.url 'http://localhost:8443/auth/realms/REALM/protocol/openid-connect/token'
      request.headers['Content-Type'] = 'application/x-www-form-urlencoded'
      request.headers['Connection'] = 'keep-alive'
      request.body = "client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=password&username=USER_NAME&password=PASSWORD"
  end
 end

对上述 POST 的响应成功并返回一个访问令牌,我用它来重写发送的请求标头,例如导航到配置文件 URL。 我正在使用 RITM 代理重写请求,它拦截请求并添加标头如下:

  def intercept_request()
    interceptor.on_request = proc do |req|
      req.header['Authorization'] = 'Bearer ' + $access_token
      req.header['Connection'] = 'keep-alive'
    end
  end

RITM.start 在创建网络驱动程序实例时被调用

身份验证请求成功,我可以打印响应并查看访问令牌。 但是,当我使用 $driver.get URL 导航到员工个人资料 URL 时,身份验证表单再次显示,而不是导航到所需的 URL。

我目前测试的内容

我把问题分成几部分:

  • 使用代理拦截请求的工作正常,我在控制台中打印测试中发生的请求和响应。
  • 我可以使用 HTTP 客户端 API 以编程方式访问端点并获取员工资料。首先我使用邮递员作为起点,后来我用 HTTP 客户端 API 自动化了它。在此测试中,代理也能正常工作。

不起作用的是在身份验证后使用 Web 驱动程序导航到我的应用程序 URL,这似乎没有获得其下一个请求的授权。有人建议我可以尝试什么吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...