【发布时间】:2021-12-26 15:40:26
【问题描述】:
我正在编写一个硒测试来验证正在下载的文件。它在本地运行良好。而且我可以通过“目标”文件夹和容器 /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 CI 中运行它时,我无法将空折叠推送到 gitlab,因此我必须创建一个文件并将其存储在文件夹中并将其推送到 gitlab。但它是测试脚本,我在设置阶段删除了这个文件,以防它干扰断言。但是管道失败了。结果并没有给我更多的细节,只是说assertionException。这是 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.Thanks。
【问题讨论】:
-
@sytech 很抱歉打扰您。但是你对 docker 和 gitlabCI 有很好的了解。所以我想知道你对这个话题有什么建议。
-
当然,我会尽快提供答案。这里的解决方案与您之前的问题具有相似的含义。绑定挂载的 docker 卷和相关文件将存在于容器/docker 守护进程上——而不是运行器主机上。
-
我还可能会仔细检查您处理无法推送空目录的方法。也许只需将
mkdir target添加到工作脚本的开头即可。我不能 100% 确定您的 Java 代码正在创建目录。 -
其实我收回我之前的评论——在使用
docker:dind和 docker-compose 时绑定挂载应该可以正常工作——我认为你不需要创建一个空文件并将其推送到亚搏体育app。这可能会使您的测试用例失败。如果docker compose up不存在,则会在您执行docker compose up时创建目录target。尝试从您的代码中删除该目录,看看是否有帮助。包含测试用例/断言的调试消息也会很有帮助。 -
@sytech 您好,感谢您的回复。我尝试删除项目存储库中的文件夹,并且没有更改测试脚本中的任何代码。当我在本地运行它时,它会在我的项目存储库中生成一个“目标”文件夹并成功运行。但是当我在gitlab CI中运行它时,它失败了,错误是'AssertionError'。
标签: docker selenium gitlab-ci selenium-grid downloadfile