无法从 Protractor 下载测试用例 return chrome://downloads/ 列表

Unable to return chrome://downloads/ list from a Protractor download test case

好吧,所以我前段时间写了这个函数,它运行良好。
基本上我正在下载一个文件,然后检查 chrome://downloads/ 中是否有 n 个项目以及文件名是否匹配

this.checkDownload = async function checkDownload(fileNameRegEx) {
    var regex = new RegExp(fileNameRegEx);
    if ((await browser.getCapabilities()).get('browserName') === 'chrome') {
        await browser.get('chrome://downloads/');
        const items = await browser.executeScript('return downloads.Manager.get().items_');
        expect(items.length).toBe(1);
        expect(items[0].file_name).toMatch(regex);
    }
};

今天我不得不重用它,但它抛出了一个错误:

Cannot read property 'get' of undefined

我认为问题在于下载。Manager 未定义。
Chrome api 有什么变化吗?有什么东西有了新名字?
我在官方 chrome 补丁说明中找不到任何相关文档。
我尝试查看下载对象,但找不到任何列出已下载项目的 property/method。

我不知道它最近是否发生了变化,但我注意到 getCabilities returns 作为主要对象的子对象的地图。可能是与此部分关联的 get() 产生了错误,而不是执行脚本中的错误。您可以尝试像下面这样添加 `['map_']

if ((await browser.getCapabilities())['map_'].get('browserName') === 'chrome') {

您可以通过选择器获取第一个元素(或更改选择器以获取任何其他元素):

const element = browser.executeScript("return document.querySelector('downloads-manager').shadowRoot.querySelector('downloads-item').shadowRoot.querySelector('a');");

或者通过在末尾添加 .innerText 来获取元素的文本

const elementWithText = browser.executeScript("return document.querySelector('downloads-manager').shadowRoot.querySelector('downloads-item').shadowRoot.querySelector('a').innerText;");

看下面的回答

如果你想检查是否有下载并且下载完成,这个可行:

var items = document.querySelector('downloads-manager').shadowRoot.querySelectorAll('#downloadsList downloads-item');
  if (Array.from(items).every(i => i.shadowRoot.querySelector('#progress') == null || i.shadowRoot.querySelector('#progress').value === 100))
    return Array.from(items).reduce((acc, curr) => [...acc, curr.shadowRoot.querySelector('div#content #file-link').href], []);

我的基于 downloads.Manager 的代码也损坏了...我很高兴能知道它被删除的原因。

编辑:看到这里,有人遇到了同样的问题并且有一个修复:https://support.google.com/chrome/thread/28267973?hl=en