【问题标题】:Unable to return chrome://downloads/ list from a Protractor download test case无法从量角器下载测试用例返回 chrome://downloads/ 列表
【发布时间】:2020-05-25 18:09:43
【问题描述】:

好的,所以我前段时间写了这个函数,它运行良好。
基本上我正在下载一个文件,然后检查 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);
    }
};

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

无法读取未定义的属性“get”

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

【问题讨论】:

  • Chrome 版本 80.0.3987.87(官方版本)(64 位)

标签: javascript selenium google-chrome download protractor


【解决方案1】:

如果你想检查是否有下载并且它们已经完成,这个工作:

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

【讨论】:

  • 谢谢!这正是我一直在寻找的。 PS那个问我的人:)
  • 您提供的链接现在已失效。很高兴得到解释或解决方案
【解决方案2】:

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

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;");

看下面的回答https://stackoverflow.com/a/51346897/9332160

【讨论】:

    【解决方案3】:

    我不能说它最近是否发生了变化,但我注意到 getCabilities 返回一个 Map 作为主对象的子对象。可能是与此部分相关联的get() 生成错误,而不是执行脚本中的错误。您可以尝试添加 `['map_'] 如下所示

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

    【讨论】:

    • 无法读取未定义的属性“get”来自“'return downloads.Manager.get().items_'”。我在 Chrome 版本 7x 上进行了测试,它返回并反对,但在 8x 中未定义。我的猜测是他们弃用了它或其他东西。不过感谢您的建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    相关资源
    最近更新 更多