【问题标题】:Context-right click save link as上下文右键单击将链接另存为
【发布时间】:2019-06-24 17:58:38
【问题描述】:

使用 Java 和 Selenium,我正在尝试获取此链接:

所以根据我的发现,首先我做一个

Actions action = new Actions(driver);
scrollToElement(href);
action.contextClick(href).perform()

它应该会调出菜单。但后来我做到了

action.sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ARROW_DOWN).build().perform();
try {
    Thread.sleep(5000);
} catch (InterruptedException e) {

}
action.sendKeys(Keys.RETURN).build().perform();  

但是,这似乎在上下文菜单之外做了一个向下箭头。 这是一个 PDF 链接,因此它没有选择“将链接另存为”,而是点击上下文菜单外部的向下箭头,因此它关闭了上下文菜单,只需左键单击 pdf href。

所以我想知道在上下文框中以某种方式让它向下移动箭头。或者是否有“将链接另存为...”的xpath?我无法对其进行检查。我想,我可以试试

//*[contains(text(), 'Save link as"')]

但不确定这是否可行?有人遇到过这种情况吗?

【问题讨论】:

  • 谢谢,但这并没有从上下文菜单中选择正确的东西
  • 也许您可以按照@ANDY_VAR 共享的链接中的建议分配下载目录。然后,您可以尝试使用 CTRL+Click 而不是 ActionChains(driver).key_down(Keys.CONTROL).click(href).key_up(Keys.CONTROL).perform() 等上下文菜单来尝试下载文件。(这是 python 命令,您应该将其更改为 Java 语法)。另一个有用的post
  • 我尝试了很多东西。 CTRL-Click 不起作用,但 ALT-ENTER 似乎起作用。但是,这可能只是在 Chrome 而不是 IE 上?

标签: java selenium contextmenu


【解决方案1】:

您正在寻找错误的方向,您不应该自动下载文件,因为您没有测试您的应用程序,您正在测试浏览器,我的期望是这不是您应该做的事情。

此外,当您远程运行测试时,即在Selenium Grid 或本地parallel mode 中运行测试时,您将面临问题,因为当前未聚焦的浏览器会将关键事件发送到聚焦的应用程序。

最好的选择是提取链接href 属性值并使用OkHttp 库执行下载,该库位于Selenium Java Client 的底层。相关代码如下:

OkHttpClient client = new OkHttpClient().newBuilder().build();

Request request = new Request.Builder().url(href.getAttribute("href")).build();
Response response = client.newCall(request).execute();

File downloadedLogo = new File("myfile.pdf");
BufferedSink sink = Okio.buffer(Okio.sink(downloadedLogo));
sink.writeAll(Objects.requireNonNull(response.body()).source());
sink.close();

【讨论】:

  • 我们有一个方法,executeFileDownload(),它调用我们提供的一个方法来点击一个链接并拦截下载。它返回一个 Pair,其中 Object 是单击链接的结果对象,File 是下载的文件。该方法确定其位置并将其放入 File 中。问题是,当您单击链接时,它会查看而不是下载,因此 executeFileDownload() 将不起作用。但是我在上面看到了您的示例,我将对其进行研究。谢谢你(虽然我想我们不应该说谢谢?;-)
  • OkHttpClient 有两个:okhttp3、org.openqa.selenium.remote.internal。有什么想法可以使用吗?
  • 这就是我最终要做的。该方法有效,但是它检查了“附件”的内容配置,但在这种情况下它是“内联”的,所以当我添加一个“内联”检查时它起作用了。
猜你喜欢
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 2010-12-15
  • 2017-04-22
  • 1970-01-01
相关资源
最近更新 更多