我的应用程序要求应用程序以 https 运行,因为浏览器通过 JavaScript 库将支付数据发送到支付网关。
如果应用程序在 http 中运行,则支付网关会抛出此错误。
我创建了一个简单的 hello world 应用程序并编写了一个简单的 geb 规范。
我似乎没有找到以 https 模式运行服务器的方法。我在网络上也找不到任何有用的资源。
现在它在随机端口以http模式运行:
Grails application running at http://localhost:54461 in environment: test
我尝试在 build.gradle 中添加 https 端口
integrationTest {
systemProperty "webdriver.chrome.driver", "C:\\webdrivers\\chromedriver.exe"
jvmArgs(
'-Dgrails.server.port.https=8443'
)
}
但这似乎被忽略了。
我还尝试在 IntelliJ 运行配置中设置 https 端口,如下所示。
我已将应用程序代码发布在GitHub中以供参考。
https://github.com/learningcscience/gebhttps
今天我觉得我又进步了一点。
我现在可以在固定端口中运行该应用程序。我在 8443 中运行了该应用程序,该应用程序适用于 https。
我使用 Spring Boot 测试注释做到了这一点
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
现在在控制台中显示
Grails application running at http://localhost:8443 in environment: test
Starting ChromeDriver 100.0.4896.20 (f9d71f93d32a6487809d6f35a9670c879fe97dfe-refs/branch-heads/4896@{#203}) on port 31898
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
https://docs.grails.org/latest/guide/testing.html
现在我只需要使用 https 而不是 http 来运行应用程序。
我已经更新了 GitHub 存储库中的代码。
好的。问题终于解决了。
最后的帮助来自 grails 社区 https://grails.slack.com/
感谢 Mattias Reichel 的帮助。
我现在将逐步说明过程,以便其他人可能不会陷入这个问题。
为了在 https 中运行功能性 geb 测试,您首先需要添加 SpringBootTest 注释,如上面更新:部分所述。
我又贴在这里了
@Integration
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
class EventCreationSpec extends GebSpec {
之后在 src/integration-test/resources/GebConfig.groovy 中设置 baseurl。
我把baseUrl =“https://localhost:8443/”
我的 GebConfig 看起来像这样
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions
import org.openqa.selenium.firefox.FirefoxDriver
environments {
// run via “./gradlew -Dgeb.env=chrome iT”
chrome {
driver = {
System.setProperty('webdriver.chrome.driver', 'C:\\webdrivers\\chromedriver.exe')
new ChromeDriver()
}
}
// run via “./gradlew -Dgeb.env=chromeHeadless iT”
chromeHeadless {
driver = {
ChromeOptions o = new ChromeOptions()
o.addArguments('headless')
new ChromeDriver(o)
}
}
// run via “./gradlew -Dgeb.env=firefox iT”
firefox {
driver = { new FirefoxDriver() }
}
}
baseUrl = "https://localhost:8443/"
之后您需要在 src/integration-test/resources/ 中创建 application-test.yml 文件
application-test.yml 文件如下所示
server:
port: 8443
ssl:
enabled: true
keyStore: c:/Users/user/selfsigned.jks
keyStorePassword: pepsicola
keyAlias: tomcat
您需要创建自签名证书。
您可以通过此过程来创建证书
https://grails.org/blog/2017-06-28.html
在上面的配置中
我的证书位于路径 c:/Users/user/selfsigned.jks 中的 selfsigned.jks 密钥库中
之后功能测试将以 https 模式启动
以我为例
http://localhost:8443/roadrace
gebspec 应该是这样的
注意顶部的 SpringBootTest 注释。
@Integration
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@Stepwise
class EventCreationSpec extends GebSpec {
def grailsApplication
def springSecurityService
def timeService
def setup() {
}
def cleanup() {
}
void "Create and publish event"() {
when:"The home page is visited"
go '/roadrace/'
$("#details-button").click()
$("#proceed-link").click()
... rest of gebspock test steps....
then:"The title is correct"
title == "Homepage"
}
}
请注意,我必须转到 /roadrace/ 因为 roadrace 是应用程序上下文路径。
如果您没有上下文路径,您可以转到“/”
最后一个障碍可能是当浏览器以 https 启动时,它可能会显示
为此,使用 geb,您可以单击“高级”,然后单击“继续到本地主机(不安全)”链接
我只需点击这样的链接
去'/公路赛/'
$("#details-button").click()
$("#proceed-link").click()
仅此而已!现在geb功能测试在https中运行。由于它是 https,您现在还可以与测试支付网关进行通信。