如何在GitLab CI中设置下载文件的Selenium测试 [英] How to set up a selenium test of download a file in Gitlab CI

查看:29
本文介绍了如何在GitLab CI中设置下载文件的Selenium测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个Selenium测试来验证正在下载的文件。它在当地运行得很好。我可以通过‘target’文件夹和容器/home/seluser/downloads轻松访问该文件。

测试脚本为:

@BeforeMethod
public void setUp() throws  MalformedURLException {

    folder = new File("target");
    
    for(File file : folder.listFiles()) {
        file.delete();
    } 

    System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
    ChromeOptions options = new ChromeOptions();

    Map<String, Object> prefs = new HashMap<String, Object>();
    prefs.put("profile.default_content_settings.popups", 0);
    prefs.put("download.default_directory", folder.getAbsolutePath());

    options.setExperimentalOption("prefs", prefs);
    DesiredCapabilities cap = new DesiredCapabilities();
    cap.setBrowserName("chrome");
    cap.setCapability(ChromeOptions.CAPABILITY, options);

    //driver = new ChromeDriver(cap);
    //driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), cap);
    driver = new RemoteWebDriver(new URL("http://docker:4444/wd/hub"), cap);
}

@AfterMethod
public void tearDown() {
    driver.quit();
}

@Test
public void downloadFileTest() throws InterruptedException {
    driver.get("http://the-internet.herokuapp.com/download");
    driver.findElement(By.linkText("some-file.txt")).click();

    Thread.sleep(2000);
    File listOffFiles[] = folder.listFiles();
    Assert.assertTrue(listOffFiles.length > 0);

    for(File file : listOffFiles) {
        Assert.assertTrue(file.length() > 0);
    } 
}

让我解释一下。首先,我在项目根存储库中创建了一个名为";target";的文件夹。然后,我通过docker-compose文件中的容器卷在Chrome docker容器中设置下载路径。

version: "3"
services:
  chrome:
    image: selenium/node-chrome:4.0.0-20211013
    container_name: chrome
    shm_size: 2gb
    depends_on:
      - selenium-hub
    volumes:
      - ./target:/home/seluser/Downloads
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_NODE_GRID_URL=http://localhost:4444
    ports:
      - "6900:5900"
  selenium-hub:
    image: selenium/hub:4.0.0-20211013
    container_name: selenium-hub
    ports:
      - "4444:4444"

此设置在本地运行良好。当我在GitLab配置项中运行它时,我不能将空文件夹推送到GitLab,因此我必须创建一个文件并将其存储在文件夹中,然后将其推送到GitLab。但是它是测试脚本,我在设置阶段删除了这个文件,以防它干扰断言。但是管道失效了。结果并没有给出更多细节,只是断言异常。以下是GitLab-ci.yml:

image: adoptopenjdk/openjdk11

stages:
  - gradle-build
  - docker-test

.gradle_template: &gradle_definition
  variables:
    GRADLE_OPTS: "-Dorg.gradle.daemon=false"
  before_script:
    - export GRADLE_USER_HOME=${CI_PROJECT_DIR}/.gradle

gradle-build:
  <<: *gradle_definition
  stage: gradle-build
  script:
    - chmod +x ./gradlew
    - ./gradlew --build-cache assemble
  cache:
    key: "$CI_COMMIT_REF_NAME"
    paths:
      - build
      - .gradle
  artifacts:
    paths:
      - build/libs/*.jar
    expire_in: 1 day
  only:
    - feature/multi-browsers

chrome-test:
  stage: docker-test
  image:
    name: docker/compose:1.29.2
    entrypoint: [ "/bin/sh", "-c" ]
  services:
    - docker:19.03.12-dind
  variables:
    DOCKER_TLS_CERTDIR: ""
    DOCKER_DRIVER: overlay2
    DOCKER_HOST: tcp://docker:2375/
  cache:
    key: "$CI_COMMIT_REF_NAME"
    policy: pull
    paths:
      - build
      - .gradle
  dependencies:
    - gradle-build
  before_script:
    - docker info
    - docker-compose --version
  script:
    - apk add --no-cache docker-compose
    - apk add openjdk11
    - docker-compose down
    - docker-compose up --build --force-recreate --no-deps -d
    - echo "Hello, chrome-test"
    - chmod +x ./gradlew
    - ./gradlew :test --tests "LogInTest_chrome"
  artifacts:
    when: always
    reports:
      junit: build/test-results/test/**/TEST-*.xml
    paths:
      - build/reports/*
    expire_in: 1 day
  only:
    - feature/multi-browsers
我想知道是否有人有在GitLab CI中使用此下载测试的经验。我想我设置的下载路径在GitLab CI中可能不起作用。我甚至不知道如何检查文件是否已下载GitLab CI。谢谢。

推荐答案

  1. 声明:‘让我解释一下。首先,我在项目根存储库中创建了一个名为";target";的文件夹。‘我假设您是通过执行folder = new File("target");来创建此文件夹的,这实际上不会创建目录,您需要应用如下内容:
String directory = "/target";
directory.mkdir()

但是,当您的代码的这一部分运行时,由于您的docker-compose.yml将Chrome节点的卷映射配置映射到主机/target目录,这实际上不会创建目录。

volumes:
  ./target:/home/seluser/Downloads

该目录将已经存在,因为docker将创建它,因此Java代码将返回布尔值"false"(因为它不需要创建目录),并将继续执行下一步。

  1. <>docker-compose.yml:您已将"Selenium/Node-Chrome"图像的映射映射到/TARGET,其中您已将/target/home/seluser/Downloads.>映射到您的"Selenium/Node-Chrome"图像由于在运行‘docker-compose up’时该目录最初并不存在,因此docker将在主机上创建该目录,以便可以将其映射到所需的卷。这里存在两个问题,首先,docker以超级用户身份运行,并将在主机上创建新的"/target"目录,但只授予它‘drwxr-xr-x’的Linux权限(755)。这意味着只有root用户可以写入该目录。因此,即使配置已映射卷,当您以"seluser"身份下载到目录时,它将无法写入,并且浏览器将返回"权限被拒绝"响应。

  2. 另一个问题是Java代码向RemoteWebDriver声明需要将下载保存到prefs.put("download.default_directory", folder.getAbsolutePath());,该位置已声明为&目标,这是一个问题,因为浏览器所在的Chrome节点没有名为‘/target’的目录,因此将无法 无论如何都要下载。这就是您的"断言异常"

    的原因

为提高效率和稳定性,建议采取以下措施:

  • 在执行"docker-compose down&;docker-compose up--build--force-recreate--no-deps-d"命令之前更新gitLab-ci.yml
mkdir /target
chmod -R 777 /target

这将确保目录可以由节点Chrome容器上的"seluser"写入

  • 更新docker-compose.yml

对于Windows主机=>;GitLab CI Docker(WSL2)=>;Chrome-Node Docker

volumes:
  ./target:/home/seluser/Downloads

对于Linux主机=>;GitLab CI Docker(Linux)=>;Chrome-Node Docker

volumes:
  /target:/home/seluser/Downloads

这将确保Chrome浏览器可以找到名为"/target"的目录,并且java测试可以看到写入主机"/target"目录的文件

另外,您的Selenium-Hub配置需要更新,发布事件和订阅事件的端口尚未映射,请更新为以下内容:

  selenium-hub:
    image: selenium/hub:4.0.0-20211013
    container_name: selenium-hub
    ports:
      - "4442:4442"
      - "4443:4443"
      - "4444:4444"

这篇关于如何在GitLab CI中设置下载文件的Selenium测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆