如何从本地机器访问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
相关产品推荐
相关产品推荐

