如何解决使用 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 举报,一经查实,本站将立刻删除。