在Chrome中使用Selenium时,无法转到新打开的标签页中的“chrome://downloads/”

db2dz4w8  于 2023-01-30  发布在  其他
关注(0)|答案(3)|浏览(233)

我正在使用Selenium和Java编写Chrome浏览器的测试。我的问题是在测试的某个地方,我下载了一些东西,它覆盖了一个网页元素。我需要关闭那个下载栏(我不能滚动到元素)。我搜索了很多,并缩小到这样一种方式,在一个新的标签中打开下载页面:

((JavascriptExecutor) driver).executeScript("window.open('chrome://downloads/');");

它会打开新选项卡,但不会转到下载页面。
我还加了一条:

driver.switchTo().window(tabs2.get(1));
driver.get("chrome://downloads/");

但也没成功。
我试过:

driver.findElement(By.cssSelector("Body")).sendKeys(Keys.CONTROL + "t");

以及

action.sendKeys(Keys.CONTROL+ "j").build().perform();
action.keyUp(Keys.CONTROL).build().perform();
Thread.sleep(500);

但他们都没开账单。

fzsnzjdm

fzsnzjdm1#

这是因为您无法以编程方式打开本地资源。Chrome会引发一个错误:

Not allowed to load local resource: chrome://downloads/

有效的解决方案是使用以下标志运行Chrome:

--disable-web-security --user-data-dir="C:\chrome_insecure"

但是这个技巧不适用于Selenium Chrome驱动程序(我不知道为什么,a试图删除chrome://version中出现的所有参数,但这没有帮助)。
因此,对我来说,上面的解决方案是唯一的工作:
C#示例:

driver.Navigate().GoToUrl("chrome://downloads/")

如果您需要打开下载的文件,还有另一个技巧:
JavaScript示例:

document.getElementsByTagName("downloads-manager")[0].shadowRoot.children["downloads-list"]._physicalItems[0].content.querySelectorAll("#file-link")[0].click()

Chrome使用Polymer和Shadow DOM,因此查询#file-link项目并不容易。
您还需要使用JavaScript编程执行.click()方法,因为它有一个自定义事件处理程序,它打开实际下载的文件,而不是href属性,该属性指向您下载文件的URL。

kmb7vmvb

kmb7vmvb2#

我从这篇文章开始,最后给出了下面的解决方案。这个解决方案在Chrome 71中有效。首先我突出显示了控件,然后点击了它。窗口对象实际上是IWebDriver,第二个方法在第一个方法之后调用。

internal void NavigateToDownloads()
        {
            window.Navigate().GoToUrl("chrome://downloads/");
        }
 internal void OpenFirstDownloadLinkJS()
        {
            IJavaScriptExecutor js = (IJavaScriptExecutor) window;
            js.ExecuteScript("document.getElementsByTagName('downloads-manager')[0].shadowRoot.children[4].children[0].children[1].shadowRoot.querySelectorAll('#content')[0].querySelector('#details > #title-area > #file-link').setAttribute('style', 'background: yellow;border: 2px solid red;');");
            js.ExecuteScript("document.getElementsByTagName('downloads-manager')[0].shadowRoot.children[4].children[0].children[1].shadowRoot.querySelectorAll('#content')[0].querySelector('#details > #title-area > #file-link').click();");
        }
2ledvvac

2ledvvac3#

使用下面的代码(我用Python写的,但只要稍加修改,它也可以用Java写):

#switching to new window
driver.execute_script("window.open('');")
driver.switch_to.window(driver.window_handles[1])

#opening downloads
driver.get('chrome://downloads/')

#closing downloads:
driver.close()

相关问题