如何通过SauceLabs远程下载文件时避免“另存为”提示

时间:2017-06-29 19:48:27

标签: angularjs node.js jenkins protractor saucelabs

从Jenkins作业运行的量角器规范,连接到SauceLabs。它单击按钮下载PDF,并检查文件是否已成功下载。我无法让Chrome浏览器使用绝对路径打开“另存为”提示。如果我将'~/Downloads'用作filename,我可以避免“另存为”提示,但是等待文件存在的browser.wait会永久挂起。

// spec.js
import fs from 'fs'
import path from 'path'

fs.mkdirSync('./downloads')

describe('Clicking DOWNLOAD button', () => {
  it('should download a proposal', () => {
    const filename = path.resolve(__dirname, './downloads/proposal.pdf')
    if (fs.existsSync(filename)) {
      fs.unlinkSync(filename)
    }
    page.downloadProposalBtn.click()
    browser.wait(() => fs.existsSync(filename), 180000)
    .then(() => {
      expect(fs.existsSync(filename)).toBe(true)
    })
  }, 180000)
})

以下是我的conf文件的相关部分。我希望prompt_for_download设置可以使提示不显示,但确实如此..

// conf.js
capabilities: {
  platform: 'macOS 10.12',
  browserName: 'chrome',
  version: '59.0',
  screenResolution: '1400x1050',
  chromeOptions: {
    args: ['--no-sandbox', '--test-type=browser', 'disable-infobars=true'],
    prefs: {
      download: {
        prompt_for_download: false,
        directory_upgrade: true,
        default_directory: path.resolve(__dirname, './downloads'),
      },
      credentials_enable_service: false,
    },
  },
},

我错过了什么吗?我觉得我可能误解了Saucelabs运行这些测试的地方,但是看起来我给fs.mkdir ./downloads文件夹,然后当我path.resolve时,它应该可以工作。

2 个答案:

答案 0 :(得分:1)

不确定这是否构成“答案”,但这就是我的进展方式。经过大量研究后,我认为测试是否无法在远程VM(如SauceLabs)上下载文件。我正在做的是将测试分成两部分:

  1. 测试下载按钮:单击按钮并断言未发生错误
  2. 向按钮正在使用的基础端点api / download发出GET请求,将响应写入文件夹,然后断言(使用nodejs)该文件存在于Jenkins项目的工作区中。这感觉很糟糕,但鉴于SauceLabs似乎没有提供对运行webdriver的VM的大量访问权限,我看不到另一种方式。

答案 1 :(得分:0)

即使该选项设置为" false"您也会收到提示。如果默认下载目录不存在。 " ./下载"是OSX语法,Chrome驱动程序可能无法理解。

请改为尝试:

default_directory: __dirname + '/downloads'