Docker Bamboo代理中Robot Framework+Selenium无法下载JSON文件
Robot Framework测试下载文件失败问题解决
报错信息
关键字'File Should Exist'重试10次后失败。
最后一次错误信息:文件'/tmp/downloads/importResults.json'不存在。
背景信息
- 测试在Docker(docker-compose)部署的Bamboo代理环境中运行
- DOWNLOAD_DIR配置为
/tmp/downloads,已从主机挂载到容器内部 - 测试执行完成后,容器内及主机上的该目录均为空
- 根因:Chrome默认将JSON响应在页面内打开而非触发下载,仅配置
download.default_directory不足以改变这一行为
修复方案
更新login.resource文件,扩展Chrome偏好设置,添加强制下载JSON文件的配置:
Login into Site with User and Password [Documentation] 打开站点并使用指定凭据登录(无SSO) [Arguments] ${username} ${password} ${MFA_KEY} ${BROWSER_TYPE_DEFINED} Get Variable Value ${BROWSER_TYPE} # 如果设置了DOWNLOAD_DIR(比如Bamboo代理环境变量)则使用,否则默认用EXECDIR(本地执行目录) ${DOWNLOAD_DIR} = Get Variable Value ${DOWNLOAD_DIR} ${EXECDIR} Set Suite Variable ${DOWNLOAD_DIR} ${DOWNLOAD_DIR} # 新增配置:强制Chrome下载JSON文件,而非在页面打开 ${prefs}= Create Dictionary download.default_directory=${DOWNLOAD_DIR} ... download.prompt_for_download=False ... download.directory_upgrade=True ... plugins.always_open_pdf_externally=True ... plugins.plugins_list=[{"enabled":False,"name":"Chrome PDF Viewer"}] ... text/json=${DOWNLOAD_DIR} ... application/json=${DOWNLOAD_DIR} IF "${BROWSER_TYPE_DEFINED}" == "CI" Open Browser ${URL} Headless Chrome options=add_experimental_option('excludeSwitches', ['enable-logging']);add_experimental_option('prefs', ${prefs});add_argument('--headless');add_argument('--no-sandbox');add_argument('--disable-dev-shm-usage') remote_url=${BrowserServers["CI"]} ELSE Open Browser ${URL} ${Browsers["${Browser}"]} options=add_experimental_option('excludeSwitches', ['enable-logging']);add_experimental_option('prefs', ${prefs}) END Set Default Browser Window Size Set Global Script Timeout
相关配置文件
Bamboo脚本代码
注:原配置中bamboo.DOWNLOAD_DIR存在拼写错误/tmp/downlodas,已修正为/tmp/downloads
export TOTAL_AGENTS_COUNT=${bamboo.TOTAL_AGENTS_COUNT} export MFA_KEY=${bamboo.AGENT0_MFA_KEY_ADMIN} export DOWNLOAD_DIR=${bamboo.DOWNLOAD_DIR} echo "here: $MFA_KEY" echo "--suite xray-settings-graphql" > scripts/run_test.cfg echo 'List of suites in current run_config_process_1.cfg file:' cat scripts/run_config_process_1.cfg echo 'Run Tcs' ls -ld /tmp/downloads echo "hello" > /tmp/downloads/testfile.txt cat /tmp/downloads/testfile.txt robot \ -o output/output.xml \ -l output/log.html \ -r output/report.html \ --argumentfile scripts/run_test.cfg \ --variable BROWSER_TYPE:CI \ --variable DOWNLOAD_DIR:$DOWNLOAD_DIR \ --metadata "1. Run: 1-st thread from scripts/run_test.cfg" \ tests
docker-compose.yml
version: '3.8' services: postgres: image: postgres:10.20 container_name: bamboo-postgres ports: - "5432:5432" environment: POSTGRES_DB: bamboo POSTGRES_USER: bamboo POSTGRES_PASSWORD: bamboo123 volumes: - postgres_data:/var/lib/postgresql/data networks: - bamboo-network bamboo: build: context: . dockerfile: Dockerfile.bamboo-server container_name: bamboo-server ports: - "8085:8085" - "54663:54663" environment: - BAMBOO_HOME=/var/atlassian/application-data/bamboo - JAVA_OPTS=-Dbamboo.agent.auto.approve.remote.agents=true -Dbamboo.jms.broker.uri=tcp://bamboo:54663 volumes: - bamboo_home:/var/atlassian/application-data/bamboo depends_on: - postgres networks: - bamboo-network mem_limit: 2g selenium-hub: image: selenium/hub:4.21.0 container_name: selenium-hub ports: - "4445:4444" environment: - GRID_TIMEOUT=600 - GRID_BROWSER_TIMEOUT=600 networks: - bamboo-network chrome-node-1: image: selenium/node-chrome:4.21.0 container_name: chrome-node-1 shm_size: 2g depends_on: - selenium-hub environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 - SE_NODE_MAX_SESSIONS=1 - SE_SESSION_TIMEOUT=600 volumes: - ./bamboo-agents/agent1/downloads:/tmp/downloads networks: - bamboo-network chrome-node-2: image: selenium/node-chrome:4.21.0 container_name: chrome-node-2 shm_size: 2g depends_on: - selenium-hub environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 - SE_NODE_MAX_SESSIONS=1 - SE_SESSION_TIMEOUT=600 volumes: - ./bamboo-agents/agent2/downloads:/tmp/downloads networks: - bamboo-network chrome-node-3: image: selenium/node-chrome:4.21.0 container_name: chrome-node-3 shm_size: 2g depends_on: - selenium-hub environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 - SE_NODE_MAX_SESSIONS=1 - SE_SESSION_TIMEOUT=600 volumes: - ./bamboo-agents/agent3/downloads:/tmp/downloads networks: - bamboo-network chrome-node-4: image: selenium/node-chrome:4.21.0 container_name: chrome-node-4 shm_size: 2g depends_on: - selenium-hub environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 - SE_NODE_MAX_SESSIONS=1 - SE_SESSION_TIMEOUT=600 volumes: - ./bamboo-agents/agent4/downloads:/tmp/downloads networks: - bamboo-network chrome-node-5: image: selenium/node-chrome:4.21.0 container_name: chrome-node-5 shm_size: 2g depends_on: - selenium-hub environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 - SE_NODE_MAX_SESSIONS=1 - SE_SESSION_TIMEOUT=600 volumes: - ./bamboo-agents/agent5/downloads:/tmp/downloads networks: - bamboo-network bamboo-agent-1: build: context: . dockerfile: Dockerfile.bamboo-agents container_name: bamboo-agent-1 environment: - BAMBOO_SERVER=http://bamboo:8085 - AGENT_NAME=agent1 - TOTAL_AGENTS_COUNT=5 volumes: - ./bamboo-agents/agent1:/opt/bamboo-agents - /etc/localtime:/etc/localtime:ro - ./bamboo-agents/agent1/downloads:/tmp/downloads depends_on: - bamboo - selenium-hub - chrome-node-1 networks: - bamboo-network mem_limit: 1g bamboo-agent-2: build: context: . dockerfile: Dockerfile.bamboo-agents container_name: bamboo-agent-2 environment: - BAMBOO_SERVER=http://bamboo:8085 - AGENT_NAME=agent2 - TOTAL_AGENTS_COUNT=5 volumes: - ./bamboo-agents/agent2:/opt/bamboo-agents - /etc/localtime:/etc/localtime:ro - ./bamboo-agents/agent2/downloads:/tmp/downloads depends_on: - bamboo - selenium-hub - chrome-node-2 networks: - bamboo-network mem_limit: 1g bamboo-agent-3: build: context: . dockerfile: Dockerfile.bamboo-agents container_name: bamboo-agent-3 environment: - BAMBOO_SERVER=http://bamboo:8085 - AGENT_NAME=agent3 - TOTAL_AGENTS_COUNT=5 volumes: - ./bamboo-agents/agent3:/opt/bamboo-agents - /etc/localtime:/etc/localtime:ro - ./bamboo-agents/agent3/downloads:/tmp/downloads depends_on: - bamboo - selenium-hub - chrome-node-3 networks: - bamboo-network mem_limit: 1g bamboo-agent-4: build: context: . dockerfile: Dockerfile.bamboo-agents container_name: bamboo-agent-4 environment: - BAMBOO_SERVER=http://bamboo:8085 - AGENT_NAME=agent4 - TOTAL_AGENTS_COUNT=5 volumes: - ./bamboo-agents/agent4:/opt/bamboo-agents - /etc/localtime:/etc/localtime:ro - ./bamboo-agents/agent4/downloads:/tmp/downloads depends_on: - bamboo - selenium-hub - chrome-node-4 networks: - bamboo-network mem_limit: 1g bamboo-agent-5: build: context: . dockerfile: Dockerfile.bamboo-agents container_name: bamboo-agent-5 environment: - BAMBOO_SERVER=http://bamboo:8085 - AGENT_NAME=agent5 - TOTAL_AGENTS_COUNT=5 volumes: - ./bamboo-agents/agent5:/opt/bamboo-agents - /etc/localtime:/etc/localtime:ro - ./bamboo-agents/agent5/downloads:/tmp/downloads depends_on: - bamboo - selenium-hub - chrome-node-5 networks: - bamboo-network mem_limit: 1g volumes: bamboo_home: postgres_data: networks: bamboo-network: driver: bridge
Dockerfile.agents
FROM openjdk:8-jdk ENV BAMBOO_SERVER=http://bamboo:8085 ENV AGENT_NAME=agent1 RUN apt-get update && \ apt-get install -y curl python3 python3-pip python3-tk nano ntpdate && \ ln -s /usr/bin/python3 /usr/bin/python && \ pip3 install \ robotframework==5.0.1 \ robotframework-seleniumlibrary \ robotframework-datadriver \ robotframework-requests \ pyotp \ robotframework-jsonlibrary && \ rm -rf /var/lib/apt/lists/* RUN mkdir -p /opt/bamboo-agents WORKDIR /opt/bamboo-agents COPY start-agents.sh /start-agents.sh RUN chmod +x /start-agents.sh CMD ["/start-agents.sh"]
start-agents.sh
echo "Starting Bamboo agent: $AGENT_NAME..." AGENT_HOME="/opt/bamboo-agents" DOWNLOADS_DIR="/tmp/downloads" mkdir -p "$AGENT_HOME" mkdir -p "$DOWNLOADS_DIR" chmod 777 "$DOWNLOADS_DIR" cd "$AGENT_HOME" # Remove old config to ensure fresh UUID # rm -f bamboo-agent.cfg.xml echo "Downloading $AGENT_NAME installer..." curl -s -O "${BAMBOO_SERVER}/agentServer/agentInstaller/atlassian-bamboo-agent-installer-8.2.6.jar" echo "Starting $AGENT_NAME..." java -Dbamboo.home=$AGENT_HOME -Dbamboo.server.broker.url=tcp://bamboo:54663?wireFormat.maxInactivityDuration=300000 -jar atlassian-bamboo-agent-installer-8.2.6.jar "${BAMBOO_SERVER}/agentServer/" & wait
内容的提问来源于stack exchange,提问作者Josue Cabrales
相关产品推荐
相关产品推荐

