我试图在我的 selenium javascript 应用程序中获取上次下载文件的名称。

我的 selenium 驱动程序使用 driver.get('chrome://downloads'); 导航到 chrome 下载页面,但是当我到达那里时,selenium 无法在下载页面上找到任何元素。

chrome 下载页面 'chrome://downloads' 有一堆 shadow-root 元素,我不知道如何进入下面以访问我想要的 id。 如何访问 shadow-root 项下的标识符?

我想获得 $("#file-link") 如下所示:

javascript - 如何使用 jquery 和 selenium 在  `shadow-root` 处访问  'chrome://downloads' 下的元素?-LMLPHP

但是当我使用 jquery 找到它时,一切都返回 null (可能是因为它在 shadow-root 后面)

javascript - 如何使用 jquery 和 selenium 在  `shadow-root` 处访问  'chrome://downloads' 下的元素?-LMLPHP
javascript - 如何使用 jquery 和 selenium 在  `shadow-root` 处访问  'chrome://downloads' 下的元素?-LMLPHP

这是我拥有的所有信息的大图,包括显示“#file-link”完全存在:

javascript - 如何使用 jquery 和 selenium 在  `shadow-root` 处访问  'chrome://downloads' 下的元素?-LMLPHP

我用来等待元素存在的代码与我用于应用程序中所有元素的代码相同,所以我认为这已经有效:

driver.wait(until.elementLocated(By.id('downloads-manager')), 120000).then(function(){
    console.log("#downloads-manager shows");
    driver.findElement(By.id('downloads-manager')).then(function(dwMan){
        //How do I "open" #shadow-root now? :(
    });
});

这是我的版本信息:
  • Chromium v​​54.0.2840.71
  • Node v6.5.0
  • ChromeDriver v2.27.440175
  • selenium-webdriver v3.4.0

  • 类似问题
  • Selenium webdriver can't find elements at chrome://downloads(这与我在 python 中遇到的问题相同)

  • 链接
  • Selenium Javascript API:https://seleniumhq.github.io/selenium/docs/api/javascript/
  • 最佳答案

    您示例中的 $ 不是 JQuery 的简写。
    它的功能被页面覆盖以仅通过 id 定位元素:

    function $(id){var el=document.getElementById(id);return el?assertInstanceof(el,HTMLElement):null}
    

    要通过 shadow DOM 进行选择,您需要使用 '/deep/' 组合器。

    因此,要获取下载页面中的所有链接:
    document.querySelectorAll("downloads-manager /deep/ downloads-item /deep/ [id=file-link]")
    

    和 Selenium :
    By.css("downloads-manager /deep/ downloads-item /deep/ [id=file-link]")
    

    关于javascript - 如何使用 jquery 和 selenium 在 `shadow-root` 处访问 'chrome://downloads' 下的元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44400482/

    10-14 15:02
    查看更多