You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从本地机器访问AWS DeviceFarm远程客户端的下载文件

问题描述

我配置了Selenium Chrome环境在AWS DeviceFarm的远程Windows节点上运行,代码如下:

download_path = '/Users/my.user/Downloads'

# Setting capabilities for my browser
caps = Selenium::WebDriver::Remote::Capabilities.chrome
caps['goog:chromeOptions'] = {
  'prefs' => {
    'download.default_directory' => download_path,
    'download.prompt_for_download' => false,
    'profile.default_content_settings.popups' => 0
  },
  'args' => [
    # 'disable-dev-shm-usage',
    'no-sandbox',
    'disable-popup-blocking',
    'window-size=1400,900',
    'disable-extensions',
    'disable-gpu'
  ]
}
caps['goog:chromeOptions']['prefs']['plugins.always_open_pdf_externally'] = true

# Trying to run this in AWS DeviceFarm
devicefarm = Aws::DeviceFarm::Client.new(region: 'us-west-2', access_key_id: ACCESS_KEY_ID,
                                         secret_access_key: SECRET_ACCESS_KEY)
test_grid_url_response = devicefarm.create_test_grid_url(project_arn: ARN, expires_in_seconds: 3000)
remote_url = test_grid_url_response.url

# Setting up a HTTP client to run it in DeviceFarm
client = Selenium::WebDriver::Remote::Http::Default.new
client.read_timeout = 5000

# Setting up the browser
driver = Selenium::WebDriver.for :remote, http_client: client, url: remote_url, capabilities: caps
url = 'https://www.google.com/'
driver.manage.timeouts.implicit_wait = 30

尝试从本地机器访问Windows远程客户端上的下载文件时遇到问题:

  • 配置了文件上传用的file_detector但无法访问远程下载文件:
    driver.file_detector = lambda do |args|
              str = args.first.to_s
              str if File.exist?(str)
            end
    
  • 直接用Ruby的File.open("C:\Users\testnode\Downloads\file_name")时,出现错误:
    ./sample.rb:46:in `initialize': No such file or directory @ rb_sysopen - C:\Users\testnode\Downloads\file_name
     (Errno::ENOENT)
            from ./sample.rb:46:in `open'
            from ./sample.rb:46:in `<main>'
    
可行解决方法

1. 先修正远程节点的下载路径配置

当前设置的download_path是本地macOS路径,远程Windows节点需要使用对应系统的路径格式:

# 远程Windows节点的下载路径,使用双反斜杠转义
download_path = 'C:\\Users\\testnode\\Downloads'
# 或用正斜杠(Ruby和Chrome均兼容)
# download_path = 'C:/Users/testnode/Downloads'

caps['goog:chromeOptions']['prefs']['download.default_directory'] = download_path

2. 通过Selenium/CDP获取远程下载文件内容

本地Ruby进程无法直接访问远程节点的文件系统,必须借助Selenium的远程协议或Chrome DevTools Protocol(CDP)获取文件:

# 启用CDP网络监听
driver.devtools.network.enable

local_save_path = '/Users/my.user/Downloads/local_download.pdf'
downloaded_content = nil

# 监听下载完成事件
driver.devtools.network.on(:download_progress) do |event|
  next unless event.state == 'completed'

  # 获取下载文件的原始内容
  response = driver.devtools.network.get_response_body(request_id: event.request_id)
  downloaded_content = response.body

  # 将内容写入本地文件
  File.binwrite(local_save_path, downloaded_content)
end

# 触发页面上的下载操作(示例:点击下载链接)
# driver.find_element(:css, 'button.download-btn').click

# 等待下载完成(根据文件大小调整时长)
sleep 15

3. 利用AWS DeviceFarm API提取测试文件

AWS DeviceFarm会自动收集远程测试节点上的文件,可通过API将目标文件下载到本地:

# 替换为你的测试运行ARN
test_run_arn = 'arn:aws:devicefarm:us-west-2:123456789012:test-run:xxxxxx'

# 列出测试运行关联的所有文件
files_response = devicefarm.list_test_run_files(test_run_arn: test_run_arn)

# 遍历找到目标文件并下载
files_response.files.each do |file|
  next unless file.name == 'file_name' # 替换为你的文件名

  file_content = devicefarm.get_test_run_file(
    test_run_arn: test_run_arn,
    file_arn: file.arn
  )

  # 保存到本地
  File.binwrite('/Users/my.user/Downloads/devicefarm_copy.pdf', file_content.content)
end

关键错误说明

  • 本地File操作无效:File.open只能访问本地机器的文件系统,远程Windows节点的C:\路径在本地不存在,必然抛出Errno::ENOENT错误。
  • file_detector用途错误:这个配置是用来上传本地文件到远程节点(比如表单上传场景),无法实现从远程节点下载文件的需求。

内容的提问来源于stack exchange,提问作者Srijith Seetharaman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:05:38