【问题标题】:Remote File Downloads远程文件下载
【发布时间】:2020-09-23 12:45:44
【问题描述】:

背景:使用 Protractor 和 Chrome 进行一些文件下载测试。我在 selenium 网格上运行,因此测试和我的 Node 环境正在服务器上执行(例如 8.2.2.2),而文件下载在远程 Windows 机器上(例如 14.3.3.3)。

文件下载曾经存储在启动测试的同一台服务器上,所以我只是在执行我的断言之前等待文件存在:

browser.wait(() => {
    return fs.existsSync(filePath)
}).then(() => {
    // expect something
})

问题:现在,文件不写入服务器(它们直接下载到浏览器),所以我没有什么可抓取的......到目前为止。由于我使用的是 selenium 网格,我无法直接从测试服务器读取远程机器。

问题:量角器浏览器对象或 chromedriver 是否有我可以获取的有关该文件下载的任何信息?试图找到一种访问文件名和文件大小的方法?我正在研究浏览器对象,但还没有找到任何东西。

【问题讨论】:

  • 导航chrome://downloads/以获取所有下载文件的列表:stackoverflow.com/questions/47068912/…
  • @FlorentB。太棒了,谢谢,我现在有一个工作版本。不知道我在以前的搜索中是如何没有遇到这个问题的
  • @FlorentB。您在哪里可以找到有关这些方法的文档? downloads.Manager 等。甚至不知道那些存在
  • 这些方法没有记录。您可以通过使用 devtools 检查chrome://downloads/ 的来源来找到它们。您也可以在铬的来源中找到它们:cs.chromium.org/chromium/src/chrome/browser/resources/…

标签: selenium-webdriver protractor selenium-chromedriver


【解决方案1】:

忘记了这个从来没有回答过,所以我会在@Florent B 在 cmets 中帮助我之后发布我自己的解决方案。为了简单起见,我将其分解,代码可能会更简洁(也取决于您的用例):

it('generates a file', () => {
    // begin file download
    btnGenerateReport.click()
    .then(() => {
        // open a new window to leave current one in state
        return browser.executeScript('window.open()')
    })
    .then(() => {
        // switch to new window
        return browser.getAllWindowHandles().then((handles) => {
            return browser.switchTo().window(handles[1]);
        })
    })
    .then(() => {
        // navigate to downloads
        return browser.get('chrome://downloads')
    })
    .then(() => {
        // pauses tests until download has 1 item AND item status is 'Complete'
        return browser.wait(() => {
            return browser.executeScript('return downloads.Manager.get().items_.length > 0 && downloads.Manager.get().items_[0].state === "COMPLETE"');
        }, 600000, `"downloads.Manager.get().items_" did not have length > 0 and/or item[0].state did not === "COMPLETE" within ${600000/1000} seconds`)
    })
    .then(() => {
        // get downloads
        return browser.executeScript('return downloads.Manager.get().items_');
    }).then((items) => {
        // this is your download item(s)
        console.log(items);
    });
});

【讨论】:

  • 感谢 sn-p。我可以使用这个。这在无头浏览器中不起作用。有什么输入可以让它工作吗?
【解决方案2】:

使用量角器/硒断言远程下载文件:

  1. 在您的遥控器上手动创建一个 FTP 服务器来托管下载文件夹

  2. 在量角器中设置下载功能,无需提示到该特定文件夹(通过 FTP 托管)

    capabilities: {
        browserName: "chrome",
        chromeOptions: {
            args: ["--disable-gpu"],
            prefs: {
                download: {
                    prompt_for_download: false,
                    directory_upgrade: true,
                    default_directory: `${__dirname}\\src\\json.file\\`
                }
            }
        }
    }
  3. 使用节点中的任何 ftp 模块断言文件夹的内容

npm install ftp-client

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2015-06-18
    • 1970-01-01
    • 2022-10-12
    • 2014-05-26
    相关资源
    最近更新 更多