如何在GitLab CI中设置下载文件的Selenium测试 [英] How to set up a selenium test of download a file in Gitlab CI
问题描述
我正在编写一个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。谢谢。
推荐答案
- 声明:‘让我解释一下。首先,我在项目根存储库中创建了一个名为";target";的文件夹。‘我假设您是通过执行
folder = new File("target");
来创建此文件夹的,这实际上不会创建目录,您需要应用如下内容:
String directory = "/target";
directory.mkdir()
但是,当您的代码的这一部分运行时,由于您的docker-compose.yml将Chrome节点的卷映射配置映射到主机/target目录,这实际上不会创建目录。
volumes:
./target:/home/seluser/Downloads
该目录将已经存在,因为docker将创建它,因此Java代码将返回布尔值"false"(因为它不需要创建目录),并将继续执行下一步。
<>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"身份下载到目录时,它将无法写入,并且浏览器将返回"权限被拒绝"响应。
另一个问题是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屋!