我正在使用Selenium和Java为Chrome浏览器编写测试。我的问题是在我测试的某个地方,我下载了一些东西,它涵盖了一个web元素。我需要关闭该下载栏(我无法滚动到该元素)。我搜索了很多并缩小到这个方向,在一个新选项卡中打开下载页面:
((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);
但是没有人打开标签。
答案 0 :(得分:0)
这是因为您无法以编程方式打开本地资源。 Chrome引发了错误:
Not allowed to load local resource: chrome://downloads/
工作解决方案是使用以下标志运行Chrome:
--disable-web-security --user-data-dir="C:\chrome_insecure"
但是这个技巧不适用于Selenium Chrome Driver(我实际上不知道为什么,试图删除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
项目。
此外,您需要以编程方式执行.click()
方法,因为其上有一个自定义事件处理程序,它会打开实际下载的文件,而不是href
属性,该属性指向您从中下载文件的URL。
答案 1 :(得分:0)
我从这篇文章开始,最后给出了下面给出的解决方案。该控件可在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();");
}