Selenium 测试在本地有效,但在 Gitlab CI 中无效

标签 selenium docker spring-boot gitlab-ci gitlab-ci-runner

我目前正在从事一个涉及经典后端/前端架构的 Java Spring Boot 项目。我正在尝试使用 Selenium WebDriver 编写一些基本的集成测试。

问题是我编写的测试在我的本地开发机器上毫无问题地通过了,但是当我通过持续集成设置 (Gitlab CI) 运行它们时却没有通过。

示例测试代码如下:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
public class ExampleTest {
    
    @LocalServerPort 
    private int port;
    
    WebDriver wd;
    
    @Test
    public void successfulLogin(){
        String url = "http://localhost:" + port;
        wd = new HtmlUnitDriver();
        wd.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
        wd.get(url);
    }
}

相关的 gitlab-ci.yml 部分是:

stages:
  - test

maven-test:
  image: maven:3.5.0-jdk-8
  stage: test
  script: "mvn test -B -Dmaven.repo.local=/root/.m2/"
  only:
    - master

CI 有一个运行器(版本 9.5.0),并发性为 1。它使用 docker 执行器和 docker:stable 图像。我不知道是否需要它,但它在 priviledged 模式下运行。 在 CI 环境中运行测试时,它们失败并出现以下错误:

org.openqa.selenium.TimeoutException: java.net.SocketTimeoutException: Read timed out

我已经尝试过 url = "http://localhost:"+ porturl = InetAddress.getLocalHost().getHostName() + ":"+ port,都在本地通过,没有在CI环境通过。

我做错了什么?


编辑:Alfageme 建议使用更准确的测试方法。在运行 CI 的同一台服务器上,我使用 git clone 克隆了我的存储库,然后运行以下命令:

sudo gitlab-runner exec docker maven-test

测试顺利通过。我真的没主意了,有人有吗?

最佳答案

我不确定为什么,但是清除 CI 机器上的各种 runner-XXXXX-project-21-concurrent-0-cache-XXXXXXXXXXXXXXXXXXX docker 容器似乎解决了这个问题。


编辑:这只是暂时解决了这个问题。问题再次发生,这次清除缓存卷没有帮助。有人有什么建议吗?

关于Selenium 测试在本地有效,但在 Gitlab CI 中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46427474/

相关文章:

spring-mvc - 如何在 spring-boot 中设置上下文参数

haskell - 使用 Haskell webdriver 包查找网页上的所有文本输入

java - 处理日历以从日历中的当前日期选择日期? Selenium

Docker swarm 尝试解析我的 compose 文件中 ENV 变量的值(因为它有一个 go 模板)并给我一个错误

docker - Docker将两个容器上的相同端口映射到主机上的不同端口

java - Spring Boot 重定向到/

google-chrome - 在新标签页中打开链接适用于 Firefox,但不适用于使用 Selenium 的 Chrome 浏览器

selenium - 如何在 selenium 自动化中更改 chrome 浏览器语言

docker - Ansible如何将本地镜像推送到私有(private)注册表

spring-boot - 是否可以在与主应用程序不同的端口上运行 SpringFox 的 swagger 和 swagger-ui?